0

我正在尝试通过 where 查询定义一个新数组,但我只能让它以一种方式工作。

这里是:

<%   

 @children = Array.new
 Topic.where(breadcrumb_id: @topic.id).each do |y|
     @children.push(y.name)
 end


 return @children
 %>


 Returns the array ["Performance Arts", "Visual Arts", "Physical Arts", "Music", "Culinary Arts"] (All topics)

但我宁愿只做

  @children = Topic.where(breadcrumb_id: @topic.id)

  return @children.each.name

  Returns "undefined method `name' for #<Enumerator:0x007fe92205a1f0>"

无论出于何种原因 .each 都不会正确响应......尽管它在第一个示例中的初始 where 调用中起作用。有什么不同?

有没有办法做到这一点,以便我可以直接通过数组提取名称?

4

3 回答 3

3

那不是什么each。您可能正在寻找map(或其别名),collect

Topic.where(...).map {|topic| topic.name}

您可以使用 Symbol#to_proc 快捷方式将其缩短一点:

Topic.where(...).map &:name
于 2012-06-22T11:05:58.243 回答
2

在 Rails 3.2 上还有pluck

@children = Topic.where(breadcrumb_id: @topic.id).pluck("name")

这具有做 aSELECT name FROM ...而不是的额外好处SELECT *

于 2012-06-22T11:22:23.653 回答
1

#where 方法返回一个ActiveRecord::Relation对象,而不是一个数组。

要获取数组,请在其上调用 #all 或 #to_a:

@children = Topic.where(breadcrumb_id: @topic.id).all
@children = Topic.where(breadcrumb_id: @topic.id).to_a

请注意,您无需将其转换为数组即可对其进行迭代。

查看 Frederick Cheung 关于为什么您使用 #each 不起作用的答案。

于 2012-06-22T10:57:48.447 回答