2013-12-20 181 views
0

我知道這裏有一堆類似的問題,但都沒有幫助我。Rails,accep_nested_attributes_for has_many:通過構建

我有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

據我所知,我需要在產品模型中使用accept_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) 

在我使用collection_select顯示option_types視圖new.html.erb:

<%= 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 %> 

最後,在產品控制器的板條箱動作我必須允許也關聯屬性,如:

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

所以主要問題是,我是否設置了accepted_nested_attributes_for,b uild,collection_select和關聯是否正確?

+:當IM建築associoation與像參數:

@product.product_option_types.build(position: 1) 

然後傳遞該信息(位置:1)來創建動作我必須在形式使用hidden_​​field?

+1

對於你的第一個問題:好吧,它工作嗎?如果不是,會發生什麼呢?對於第二個問題,是的,你需要'hidden_​​field'來傳遞位置 - 或者如果它不會被修改,你可以簡單地在你的'create'動作而不是'new'中設置。 – janfoeh

+0

這真的是個大問題嗎? – Srle

回答

0

在我的理解你感興趣的數據是OptionType。 那麼爲什麼不使用數據而不是關係。

Product.first.option_types 

比關係表更有趣。

將product_option_types更改爲option_types。