Jquery RubyOnRails自引用多对多

Jquery RubyOnRails自引用多对多,jquery,ruby-on-rails,ruby,has-many-through,self-reference,Jquery,Ruby On Rails,Ruby,Has Many Through,Self Reference,我有一个产品模型,我需要实现相关的产品,所以我认为自我参考是最好的方式: class Product < ActiveRecord::Base has_many :related_product_associations, class_name: "RelatedProduct" has_many :related_products, through: :related_product_associations, source: :related_product end clas

我有一个产品模型,我需要实现相关的产品,所以我认为自我参考是最好的方式:

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
问题: 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 %>
有没有一种方法可以通过jQuery嵌套表单实现类似cocoon的行为,这样只有在需要时才能添加更多字段?
您的目标是在此表单中提交一个与产品相关的ID数组

为此,参数必须命名为product[realted\u product\u ids][]。不幸的是,你不能这样做。第二个参数必须是参数

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

对于模型上的命名,我会考虑调用连接表,比如ReleDyPositTug关联,因为这就是产品模型中所称的。谢谢你的友好回复。引发了一个异常:未定义的方法“product[related\u product\u ids][]”,因为我假设您指的是除related\u product\u ids[]之外的product[related\u product\u ids][]。无论如何,原始代码也会引发同样的异常。然而,复选框变体的工作原理几乎就像一个符咒。唯一的问题是相关的产品ID没有保存到DB,日志说这是不允许的参数,尽管我将其列入了白名单:params.require:product.permit…,:related\u-product\u-id,…params.require:product.permit…,related\u-product\u-id:[],…谢谢!它工作得很好!你知道为什么collection_select引发了一个异常吗?顺便说一句,我不太使用collection select,但它似乎应该正确处理多个异常。尝试这可能会以数组格式发送。
<%- (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 %>