options_from_collection_for_select用于关系模型

时间:2016-03-14 16:46:40

标签: ruby-on-rails

我有两个模型,Customer和Product with has_many association。

使用options_from_collection_for_select我想显示每个客户的产品名称。我想在下面做这样的事情

<%= select_tag(:customer_product, options_from_collection_for_select(@customers, @customers.products.id, @customers.products.name) )%>

  <%= select_tag(:customer_product, options_from_collection_for_select(@customers,:product.id, :product.name) )%>

我尝试了第二个并得到了这个错误

undefined method `id' for :product:Symbol

我想知道这样的事情是否可行。或者我如何轻松实现上述功能。

2 个答案:

答案 0 :(得分:0)

试试这个:

options_from_collection_for_select(@customers.products, 'id', 'name')

第一个参数是项的集合,第二个和第三个是返回id和文本的属性的名称。

参考文献:http://apidock.com/rails/v4.2.1/ActionView/Helpers/FormOptionsHelper/options_from_collection_for_select

答案 1 :(得分:0)

正如options_from_collection_for_select所述,options_from_collection_for_select期望collection作为第一个参数,value_methodtext_method作为第二个和第三个参数将被调用在collection

如果您将@customers作为第一个参数传递,那么您只能将Customer的属性作为第二个和第三个传递,如下所示:

<%= select_tag(:customer_product, options_from_collection_for_select(@customers, 'id', 'name') )%>

如果您需要传递@products,那么首先您需要通过@products设置ruby,如:

@products = @customers.inject([]).each do |all_products, customer_products|
  all_products << customer_products
end.flatten.uniq

或者,根据您的逻辑,您甚至可以通过sql本身。

然后使用以下内容查看您的视图:

<%= select_tag(:customer_product, options_from_collection_for_select(@products, 'id', 'name') )%>