新手问题 网页上想要的效果和 Model 的对应关系弄不明白了

blueplanet · 2013年01月28日 · 最后由 doitian 回复于 2013年01月29日 · 3682 次阅读

网页上想要的效果

  • 想做的功能
    • 三个人想要聚会,选了两个备选日期
    • 大家各自输入自己的两个日期的参加可否情况
    • 最后选出可能参加人数最多的日期来聚会
  • 设想的界面

    • 每一行是一个备选日期
    • 每一列是一个参加者
    • 每一个单元格是参加者的备选日的参加可否情况

      2013/01/31
      2013/02/01

定义的模型

class Event
  has_many :days
  has_many :users
  has_many :statuses ???? 方案2
end

class Day
  belongs_to :event
  has_many :statuses ??? 方案1
end

class User
  belongs_to :event
end

class Status
  belongs_to :day ??? 方案1
  belongs_to :event ??? 方案2
end

我的问题

  • 单纯从模型来看,我认为应该把EventStatus做成 1:n 的关系
  • 可是在 view 里面看的时候,如果DayStatus做成 1:n 的关系的话我知道怎么实现;如果是EventStatus是 1:n 的话,不知道应该怎么实现

我现在的问题是

  1. 不知道方案 2 中,在 Event 中定义has_many :statuses之后,还应该怎样定义一个方法才能实现@event.statuses[row][col]这样的写法?
  2. 如果是你的话,选哪种实现方法?

方案 1: Day 和 Status 1:n

%tbody
  - @event.days.size.times do |row|
    %tr
      %td(id="rowItem#{row+1}")= @event.days[row].text
      - @event.users.size.times do |col|
        %td= @event.days[row].statuses[col].text

方案 2: Event 和 Status 1:n

%tbody
  - @event.days.size.times do |row|
    %tr
      %td(id="rowItem#{row+1}")= @event.days[row].text
      - @event.users.size.times do |col|
        %td= @event.statuses[row][col].text

Model 跟着业务走,user has_many appointments,然后再想怎么处理复杂的表,从 params 里面提取和转化数据

cell 加 row col 字段

不过按你的问题,这东西应该存成 user event date 之间的关系,关系表中加属性标示参加的状态。除非你用户和日期永远不变,不然存位置没意义

啥啥啥哦,你的业务怎么还去描述行和列哦,吃撑了

你只需要描述,Event 和 谁 还有时间

你的日程是一个时间段,然后遍历每一个人在那天是否有数据 然后再渲染 td 的内容

业务的数据,你要明白它是平行的,不是立体的。。。你可以体现成立体的 view 别把 view 的展示现象直接搬到数据库啊!

#1 楼 @knwang 不好意思,没理解你的意思。

#3 楼 @doitian #4 楼 @badboy 可能还是我没有说清楚,我改一下说明

class Event
  def indexed_statuses
    statuses.inject({}) do |map, status|
      map[[status.user.id, status.day.id]] = status
      map
    end
  end
end

#7 楼 @doitian 这个我看懂了!非常感谢!

有个小疑问。方法的内容是生成一个 Hash。 在实际的代码中,是不是把生成 Hash 的部分缓存起来,只有在发生变动的时候才重新生成比较好?

design your params first. 比如你在 controller 里面的 params 想是这样的

params = { "1" => { "date_1" => "2013/1/3", "date_2" => "2013/3/2"}, "2" => {"date_1" => "2013/3/2", "date_2" => "2013/4/3"}} 然后再回到 view 里面把 form 结构写成能发送这样的 hash.

有点类似先设计接口,再写实现。

#5 楼 @blueplanet 复杂的表关系没有必要一定走 Rails convention 的 model based form 或者 nested forms 这些。

#9 楼 #10 楼 @knwang 喔!这个思路确实和我想的不同,很有启发,非常感谢!我再仔细想想!f

#8 楼 @blueplanet 这个在 controller 里赋值给 instance variable 就可以,同步状态挺麻烦的

需要 登录 后方可回复, 如果你还没有账号请 注册新账号