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

这里的选择是书籍的集合,但是因为书籍可以在多个选择中,所以我使用带有连接表的双 has_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 回答