1

私は次のモデルを持っています

# Database fields: id, name
Book < ActiveRecord::Base
    has_many :books_selections
    has_many :selections, :through => :books_selections

# Database fields: id, name
Selection < ActiveRecord::Base
    has_many :books_selections
    has_many :books, :through => :books_selections
    attr_accessible :books_attributes
    accepts_nested_attributes_for :books

# Database fields: book_id, selection_id
Books_Selection < ActiveRecord::Base
    belongs_to :book
    belongs_to :selection

ここで、Selectionは本のコレクションですが、本は複数の選択に含まれる可能性があるため、結合テーブルでdoublehas_many構造を使用します。結合テーブルには「id」属性がないことに注意してください。これは問題ですか?

選択のための作成アクションに、複数の既存の本を直接関連付けさせようとしています。ビューでは、入力要素を動的に作成します。たとえば、次の最終的なhtmlを使用します。

<input type="hidden" name="selection[books_attributes][id]" value="5" />
<input type="hidden" name="selection[books_attributes][id]" value="9" />

SelectionコントローラーのCreateメソッドには、特定のコードは含まれていません。次のようになります。

@selection = Selection.new(params[:selection])

新しいビューが送信されると、選択範囲が(モデルとして)作成されますが、ブックはそれに関連付けられていません。これはどのように解決できますか?

4

1 に答える 1

1

非表示フィールドにどのように入力するかはわかりませんが、その名前selection[books_attributes][id]が正しくありません。 http://guides.rubyonrails.org/form_helpers.html#understanding-parameter-naming-conventions

に多くの関連付けがある場合、ネストされた属性はハッシュの配列です。

selection.books_attributes = [{ :id => 5}, { :id => 9 }]

その後、を送信しますselection[books_attributes][][id]

ネストされた属性は、新しい関連付けを作成したり、既存の関連付けを更新したりする場合に使用します。既存の本を選択範囲に割り当てるだけの場合は、を使用できますselection[books_ids][]

于 2012-05-28T12:54:07.693 に答える