我有两个模型,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
我想知道这样的事情是否可行。或者我如何轻松实现上述功能。
答案 0 :(得分:0)
试试这个:
options_from_collection_for_select(@customers.products, 'id', 'name')
第一个参数是项的集合,第二个和第三个是返回id和文本的属性的名称。
答案 1 :(得分:0)
正如options_from_collection_for_select所述,options_from_collection_for_select
期望collection
作为第一个参数,value_method
和text_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') )%>