3

これは、ここで提起された質問の続きです

ActiveRecord を使用して親オブジェクトに 1 対多のオブジェクトを追加する方法

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 

複数選択チェック ボックスでエントリの削除を処理する方法は、1 対多のエンティティを表すために使用されます。エントリを追加または更新できますが、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_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 で関連付けを手動で設定または削除する必要はありません...

于 2013-01-15T12:04:26.153 に答える