在创建具有多对多关系的新模型时关联现有模型

时间:2012-05-28 11:59:40

标签: ruby-on-rails activerecord many-to-many has-many-through model-associations

我有以下型号

# 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

这里的一个选择是一本书的集合,但由于书籍可以有多种选择,我使用带有连接表的double 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])

提交新视图时,将创建选择(作为模型),但书籍不与其关联。怎么解决这个问题?

1 个答案:

答案 0 :(得分:1)

不确定如何填充隐藏字段,但其名称选择[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][]