这是对此处提出的问题的继续
How to add one-to-many objects to the parent object using ActiveRecord
class Foo < ActiveRecord::Base
has_many :foo_bars
end
class Bar < ActiveRecord::Base
end
class FooBar < ActiveRecord::Base
belongs_to :foo
belongs_to :bar
end
如何处理多选复选框中的条目删除用于表示一对多实体。我可以添加或更新条目,但删除似乎失败,因为 foo_id 似乎是空的,查询似乎是更新而不是删除。
编辑:
我使用以下代码尝试了@charlysisto建议
我的控制器代码如下:
class Foo < ActiveRecord::Base
has_many :foo_bars
has_many :bars, :through => :foo_bars
end
def edit
@foo = Foo.find(params[:id])
@sites = Site.where(company_id: @current_user.company_id).all
end
def update
@foo = Foo.find(params[:id])
if @foo.update_attributes(params[:foo])
flash[:notice] = "Foo was successfully updated"
redirect_to foos_path
else
render :action => 'edit'
end
end
查看代码如下:
<% @bars.each do |bar| %>
<%= check_box_tag 'bar_ids[]', bar.id %>
<%= bar.name %>
<% end %>
所以我尝试了这些更改,但是如果我删除了一条记录,foo_bars似乎仍然没有反映出这些更改。
答案 0 :(得分:3)
您的协会缺少的是:
class Foo < ActiveRecord::Base
has_many :bars, :through => :foo_bars
end
... has_many(或has_many:through)宏为您提供了大量的方法,包括bar_ids
和bar_ids= [...]
所以你需要在你的视图/控制器中做的就是:
# edit.html.haml which will send an array of bar_ids
=f.select :bar_ids, Bar.all.map {|b| [b.name, b.id]}, {}, :multiple => true
# foo_controller
@foo.update_attributes(params[:foo])
就是这样!无需在FooController#update ...
中手动设置或删除关联