RubyOnRails自我引用了很多对很多

时间:2015-08-31 20:37:18

标签: 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

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
  1. 有没有办法用jQuery嵌套表单实现类似cocoon的行为,所以我只能在需要时添加更多字段?

1 个答案:

答案 0 :(得分:0)

您的目标是以此格式related_product_ids=[1,2,3,4]提交一系列ID。

为此,必须将param命名为product [realted_product_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 %>