由.where返回的集合未按预期响应

时间:2012-06-22 10:44:43

标签: ruby ruby-on-rails-3 activerecord where

我正在尝试通过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>"

无论出于何种原因。每个都不会正确回应...虽然它适用于第一个例子中的初始调用。有什么区别?

并且有没有办法这样做,以便我可以直接通过数组拉名称?

3 个答案:

答案 0 :(得分:3)

这不是each所做的。您可能正在寻找map(或其别名)collect

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

使用Symbol#to_proc快捷方式可以缩短它:

Topic.where(...).map &:name

答案 1 :(得分:2)

在Rails 3.2上还有pluck

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

这样做有SELECT name FROM ...而不是SELECT *

的额外好处

答案 2 :(得分: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不起作用的答案。