3

这是此处提出的问题的延续

如何使用 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 似乎仍然没有反映这些更改。

4

1 回答 1

3

您的关联中缺少的是:

class Foo < ActiveRecord::Base
  has_many :bars, :through => :foo_bars
end

... has_many(或 has_many :through)宏为您提供了大量方法,包括bar_idsbar_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 中的关联...

于 2013-01-15T12:04:26.153 回答