2015-08-31 24 views
0

我有一个产品模型,我需要实现相关产品,所以我想一个自我引用是做到这一点的最好办法:RubyOnRails自我引用多对多

class Product < ActiveRecord::Base 
    has_many :related_product_associations, class_name: "RelatedProduct" 
    has_many :related_products, through: :related_product_associations, source: :related_product 
end 

class RelatedProduct < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :related_product, class_name: "Product" 
end 

在products_controller:

params.require(:product).permit(..., :related_products, ...) 

问题: 1.我的车型/控​​制器是否正确 2.如何制作几种相关产品的表格。

我认为形式可以是这个样子:

<%= f.collection_select :related_product, @products, :id, :name, include_blank: true %> 
<%= f.collection_select :related_product, @products, :id, :name, include_blank: true %> 
<%= f.collection_select :related_product, @products, :id, :name, include_blank: true %> 

在products_controller:

@products = Product.all 
  • 是否有实现茧般的行为方式与jQuery嵌套形式,所以我可以添加更多的领域,只有当我需要他们?
  • +0

    有关型号的命名 - 我会考虑调用连接表像related_product_association,因为这就是你把它的产品型号。 – Swards

    回答

    0

    你的目标是提交一个这种形式的ID数组related_product_ids=[1,2,3,4]

    为此,参数必须命名为product [realted_product_ids] []。不幸的是,你不能这样做。第二PARAM必须是设置了一个param

    # Note this doesn't work 
    <%= f.collection_select 'related_product_ids[]', @products, :id, :name, include_blank: true %> 
    

    但是,你能做到这一点(多)

    <%= f.collection_select :related_product_ids, @products, :id, :name, {:selected => @product.related_product_ids, :include_blank => true}, {:multiple => true} %> 
    

    或者你也可以做到这一点

    <%- (1..4).each do |i| %> 
        <%= select_tag 'product[related_product_ids][]', options_for_select(@products.map{|p| [p.name, p.id]}, @product.related_product_ids[i]), :include_blank => true %> 
    <% end %> 
    

    你也可以尝试一下与复选框。后来,切换到动态添加的下拉菜单应该不会太难。

    <%- @products.each do |product| %> 
        <%= check_box_tag 'product[related_product_ids][]', product.id, @product.related_product_ids.include?(product.id) %> 
        <%= product.name %> 
    <%- end %> 
    
    +0

    Hello Swards!谢谢你的回复。 <%= f.collection_select'product [related_product_ids] []',@products,:id,:name,include_blank:true%>产生一个异常:未定义的方法'product [related_product_ids] []'产品: 0x00000004d45ef0> 我假设你的意思是产品[related_product_ids] [],除了related_product_ids []。无论如何,原始代码也会引发相同的异常。 –

    +0

    然而,复选框变体作品几乎就像一个魅力。 related_product_ids没有保存到数据库的唯一问题,日志说这是不允许的参数,尽管我将其列入白名单: params.require(:product).permit(...,:related_product_ids,...) –

    +0

    params.require(:product).permit(...,related_product_ids:[],...) – Swards