2013-07-26 67 views
0

我有一個產品表和相關產品的表,相關工作的一種方式:填充自連接表中的Rails 4

Product(id: int, name: string) 
RelatedProduct(id: int, product1: int, product2: int) 

有如下型號:

class Product < ActiveRecord::Base 
    validates :name, :uniqueness => true, :presence => true 
    has_many :relations, :class_name => "RelatedProducts", :foreign_key => :product1, inverse_of: :source 
    has_many :related_products, through: :relations, :source => :destination 
end 

class RelatedProducts < ActiveRecord::Base 
    belongs_to :source, :class_name => "Product", inverse_of: :relations 
    belongs_to :destination, :foreign_key => :product2, :class_name => "Product" 
end 

這工作,如果我預填充RelatedProducts表,show view將正確顯示所有相關產品。我無法弄清楚如何從html中填充RelatedProducts?

<%= form_for(@product) do |f| %> 

    <div class="field"> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
    </div> 

    <div class="related-products field"> 
    <h3>Related Products</h3> 
    <%= f.collection_check_boxes :related_products, Product.where.not(id: @product.id), :self, :name %> 
    </div> 

    <div class="actions"> 
    <%= f.submit 'Update Products' %> 
    </div> 
<% end %> 

強參數被定義爲:

params.require(:product).permit(:name, related_products: [:id, :name]) 
+0

也許嘗試爲related_products模型製作form_for – amb110395

回答

0

我的解決辦法是使該視圖使用ID,然後提交他們

<div class="related-products field"> 
    <h3>Related Products</h3> 
    <%= f.collection_check_boxes :related_products, Product.where.not(id: @product.id), :id, :name %> 
</div> 

我隨後在功能耦合這將id列表轉換爲產品列表的型號

def related_products_list=(ids) 
    self.related_products = ids.reject(&:empty?).collect { |id| Product.find(id) } 
end 

這工作提交,但複選框不會預先檢查編輯。這是因爲該模型談論的產品,但該視圖有一個ID列表,所以不會找到匹配。我使用的解決方案是手動循環訪問集合來創建複選框,而不是使用collection_check_boxes。

<% Product.where.not(id: @product.id).each do |p| %> 
    <%= check_box_tag 'product[related_products][]', p.id, @product.is_related_to?(p), id: "product_related_products_" + p.id.to_s %> 
    <%= label_tag "product_related_products_" + p.id.to_s, p.name %> 
<% end %>