Rails,accepts_nested_attributes_for has_many:通过构建

时间:2013-12-20 12:17:40

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

我知道这里有很多类似的问题,但都没有帮助我。

我有3个型号:

class Product < ActiveRecord::Base
   has_many :product_option_types
   has_many :option_types, through: :product_option_types
end

class OptionType < ActiveRecord::Base
    has_many :product_option_types
    has_many :products, through: :product_option_types
end

class ProductOptionType < ActiveRecord::Base
    belongs_to :product
    belongs_to :option_type
end

表OptionType预定义如下:

enter image description here

现在,在创建新产品时,我还需要使用product_id和option_type id填充表product_option_types:这是product_option_types表的设计:

enter image description here

据我所知,我需要在产品型号中使用accepts_nested_attributes_for来引用product_option_types,因此在产品型号中我需要关注

accepts_nested_attributes_for :product_option_types, allow_destroy: true

在渲染new.html.erb之前,我需要按以下方式构建product_option_types

@product = Product.new
@product.product_option_types.build(position: 1)

在视图new.html.erb中我使用collection_select显示option_types:

<%= f.fields_for :product_option_types do |builder| %>
    <%= builder.label :option_type_id, "Options" %>
    <%= builder.collection_select :option_type_id, OptionType.all(order: 'name ASC'), 
                                  :id, :name, { prompt: "Select option..."} %>
<% end %>

最后在产品控制器的crate动作中,我还必须允许关联属性,如:

permited = params[:product].permit(product_option_types_attributes: [:option_type_id])

所以主要问题是,我是否正确设置了accepts_nested_attributes_for,build,collection_select和association?

+:当我用以下参数建立联合时:

@product.product_option_types.build(position: 1)

然后传递该信息(位置:1)来创建动作我必须在表单中使用hidden_​​field吗?

1 个答案:

答案 0 :(得分:0)

根据我的理解,您感兴趣的数据是OptionType。 那么为什么不使用数据而不是关系。

 Product.first.option_types

比关系表更有趣。

从product_option_types更改为option_types。