2

我正在尝试对一个对象子集进行 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

4

3 回答 3

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
于 2011-05-22T20:39:18.973 回答
0

尝试更换:

<%= 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 %>
于 2011-05-22T20:19:49.040 回答
0

我不确定,但这似乎these_shifts不是您所期望的,然后当解析参数时,它会检查那里有什么东西,而不是像您在哪里一样在俱乐部上fields_for找到您正在寻找的东西。(见https://github.com/rails/rails/blob/30c67000cab2284689bd93f25937c088d1ec6e74/actionview/lib/action_view/helpers/form_helper.rb#L1943call(:shields)f.fields_for :shields, nil do |s|

于 2015-10-01T20:26:50.587 回答