【问题标题】:Associate existing models when creating a new one with many to many relations在创建具有多对多关系的新模型时关联现有模型
【发布时间】:2012-05-28 11:59:40
【问题描述】:

我有以下型号

# 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])

当新视图被提交时,选择被创建(作为一个模型),但书籍没有与之关联。怎么解决?

【问题讨论】:

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


    【解决方案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][]

    【讨论】:

    • 谢谢。经过一些尝试后,我将模型更改为 has_many_and_belongs_to(这是我最初的设置),隐藏字段的名称为 selection[book_ids][]。网上的一些资源说HMABT方法已经过时了,双has_many是首选,但是因为关系本身不需要任何数据我认为这个解决方案也是正确的。
    猜你喜欢
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2020-02-09
    • 2021-05-25
    • 2020-01-27
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多