将第二种方法uniq.pluck(:state)
添加到下面的代码后,我收到以下错误消息:
undefined method `state' for "AK":String.
我查看了这里的所有帖子,找不到与此问题相关的任何内容。我们将非常感谢您提供的任何见解或帮助。
<%= f.collection_select :state, (Boli.order(:state).uniq.pluck(:state)), :id, :state, include_blank: true %>
谢谢@D-side,现在使用groups_collection时遇到了困难。我希望用户能够选择特定州的一组银行。获取错误消息undefined方法`map'为:id:Symbol,使用以下代码:
<%= f.grouped_collection_select :bank, :id, Boli.order(:bank), :id, :bank, include_blank: true%>
答案 0 :(得分:2)
pluck
返回属性值数组。字符串,在你的情况下。
collection_select
是在考虑模型实例的情况下构建的,因为它接受......好吧,the docs say it better无论如何:
collection_select(method,collection,value_method,text_method,options = {},html_options = {})
&LT; ...&GT;
:value_method
和:text_method
参数是要在集合的每个成员上调用的方法。返回值分别用作每个<option>
标记的值属性和内容。它们也可以是响应调用的任何对象,例如proc,将为集合的每个成员调用以检索值/文本。
显然,由于您已经提取了属性state
的值,因此再次对结果值调用state
是没有意义的。
您可以通过多种方式解决此问题。
DISTINCT ON (expr)
将.uniq.pluck(:state)
替换为.select("DISTINCT ON (state) id, state")
,您将获得ActiveRecord模型实例,因此生成的集合中的每个元素都将包含方法id
和state
,{ {1}}期待。
collection_select
...通过提供pluck
而非proc
和:id
,将字符串作为参数并生成适当的值。
这一切都归结为你需要的东西。