我正在尝试为一个子集的对象执行fields_for,但有些对象很吃力。以下是一些详细信息:
class Club < ActiveRecord::Base
has_many :shifts
...
<%= form_for club, :url => shift_builders_url do |f| %>
...
<% these_shifts = Shift.where(:club_id => club.id, :date => date) %>
<%= f.fields_for :shifts, these_shifts do |s| %>
<td><%= render "shift_fields", :f => s %></td>
<% end %>
...
因此,代码基本上按预期工作,尽管在视图中进行这些调用显然很糟糕。为了清理代码,我添加了以下控制器代码:
...
@shifts_by_club_and_date = sort_shifts_by_club_and_date(@shifts)
...
private
def sort_shifts_by_club_and_date(shifts)
return_hash = Hash.new
shifts.each do |s|
return_hash["#{s.club_id}-#{s.date}"] ? return_hash["#{s.club_id}-#{s.date}"] << s : return_hash["#{s.club_id}-#{s.date}"] = [s]
end
return return_hash
end
然后当我这样做时:
<%= form_for club, :url => shift_builders_url do |f| %>
...
<% these_shifts = @shifts_by_club_and_date["#{club.id}-#{date}"] %>
<%= f.fields_for :shifts, these_shifts do |s| %>
<td><%= render "shift_fields", :f => s %></td>
<% end %>
...
它没有接受这个数组,而是做了一些类似的事情:
Shift Load (7.3ms) SELECT `shifts`.* FROM `shifts` WHERE (`shifts`.club_id = 2)
然后为俱乐部的每个移位对象绘制字段。。。传入一个Arel对象似乎很有效,但数组似乎不行。让fields_for只绘制对象子集的最佳方法是什么?
我也研究过这个类似的问题,但我不认为我能像has_many:shifts_on_day(date)那样进行关联。。。。
编辑以添加:我使用MySQL 在REE上运行Rails 3.0.7
<%= form_for club, :url => shift_builders_url do |f| %>
...
<% these_shifts = club.shifts_for_date(some_date) %>
<%= f.fields_for :shifts, these_shifts do |s| %>
<td><%= render "shift_fields", :f => s %></td>
<% end %>
型号
class Club < AR::Base
has_many :shifts
...
def shifts_for_date(date)
shifts.where(:date => date)
end
...
end
尝试替换:
<%= f.fields_for :shifts, these_shifts do |s| %>
<td><%= render "shift_fields", :f => s %></td>
<% end %>
带有:
<% for shift in these_shifts do %>
<td><%= f.field_for :shift %></td>
<% end %>
我不确定,但these_shifts
似乎不是你所期望的,那么当fields_for
解析参数时,它会检查那里是否有东西,而没有找到你想要的东西,它会在俱乐部上做call(:shields)
,就像你在做f.fields_for :shields, nil do |s|
一样。(参见https://github.com/rails/rails/blob/30c67000cab2284689bd93f25937c088d1ec6e74/actionview/lib/action_view/helpers/form_helper.rb#L1943)