我有以下型号
# 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])
提交新视图时,将创建选择(作为模型),但书籍不与其关联。怎么解决这个问题?
答案 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][]
。