我正在尝试对象子集中的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只绘制对象子集的最佳方法是什么?
我看过this similar question,但我认为我不能像has_many那样做关联:shifting_on_day(date)....
编辑添加: 我正在使用MySQL
在REE上运行Rails 3.0.7答案 0 :(得分:1)
<%= 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
答案 1 :(得分:0)
尝试更换:
<%= f.fields_for :shifts, these_shifts do |s| %>
<td><%= render "shift_fields", :f => s %></td>
<% end %>
with:
<% for shift in these_shifts do %>
<td><%= f.field_for :shift %></td>
<% end %>
答案 2 :(得分:0)
我不确定,但似乎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)