2013-08-27 88 views
0

讓我們考慮一下Rails中多對多模型的經典實現。Rails嵌套形式多對多特例

class Order 
    has_many :order_products 
    has_many :products, through: order_products 
    accepts_nested_attributes_for :order_products 
end 

class Product 
    has_many :order_products 
    has_many :orders, through: order_products 
end 

class OrderProduct 
    belongs_to :order 
    belongs_to :product 
    accepts_nested_attributes_for :products 
end 

<%= form_for(@order) do |f| %> 
    <% f.fields_for :order_products do |op|%> 
    <%= op.label :amount %><br> 
    <%= op.text_field :amount %> 

    <% op.fields_for :product do |p|%> 
    <%= p.label :name %><br> 
    <%= p.text_field :name %> 
    <% end %> 
<% end %> 

的問題是在我來說,我有一個完整的固定表產品,與預定義的產品。我需要顯示所有產品列表創建/編輯視圖訂單和用戶應該設置他需要的每個產品的數量,沒有辦法添加額外的產品。 order_products是一個連接表。

在經典的例子,用戶自己可以添加/刪除產品產品表,在我的情況下,他只能從預定義的選擇需要的產品,他的選擇應該記錄在order_products表。

上面的代碼是給出的經典案例,我不知道如何適合它到我的情況。

我將不勝感激您的幫助。

附錄: 以下是代碼,我現在所擁有的

<%= form_<%= form_for(@order) do |f| %> 
    <% f.fields_for :order_products do |op|%> 
    <%= op.label :amount %><br> 
    <%= op.text_field :amount %> 
    <%= op.label :product_id, "Product" %> 
    <%= op.select :product_id, Product.all.collect { |p| [p.name, p.id] } %> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

我不得不添加以下代碼命令控制器,以便創造所有非icluded產品0量訂購,所有這些都在形式上。這不是最好的方法,你知道如何正確地做到這一點嗎?

Product.all.each { |p| order.orderproducts.push(OrderProduct.new(:product_id => p.id,:order_id => 1, :amount => 0)) if [email protected]?{|b| b.product_id == p.id}} 

回答

2

好像你需要在OrderProductamount列/屬性,你可以刪除這個類的嵌套產品申報。

然後,您可以從訂單中創建OrderProduct個實例,指定所需的產品和該產品的數量。您不需要產品的任何嵌套,因爲您已經創建了這些嵌套。

你的形式就變成了這樣:

<%= form_for(@order) do |f| %> 
    <% f.fields_for :order_products do |op|%> 
    <%= op.label :amount %><br> 
    <%= op.text_field :amount %> 
    <%= op.label :product_id, "Product" %> 
    <%= op.select :product_id, Product.all.collect { |p| [p.name, p.id] } %> 
<% end %> 

這也將是值得加入驗證您OrderProduct,以確保amount是有效的,積極的,整數。

validates_numericality_of :amount, 
    :only_integer => true, 
    :greater_than_or_equal_to => 0 
+0

非常感謝您的回答,我已將當前代碼添加到問題的附錄中。問題是我無法得到它的工作,它與'意想不到的keyword_ensure,期待$結束'失敗。我做錯了什麼? – user10756

+0

你有兩個'<% end %>'語句來關閉你的表單。 – Shadwell

+0

對,謝謝,我已經在附錄中對它進行了修改,但是現在我有一些不同的*未定義的局部變量或方法'form_'for *。 – user10756