ActiveRecord查找并仅返回选定的列

时间:2011-10-27 02:09:56

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

编辑2

如果您偶然发现了这个问题,请检查这两个答案,因为我现在正在使用此选项


我有一个相当大的自定义数据集,我想回到json作为回声。一部分是:

l=Location.find(row.id)
tmp[row.id]=l

但我想做类似的事情:

l=Location.find(row.id).select("name, website, city")
tmp[row.id]=l

但这似乎并没有奏效。我怎么能让这个工作?

THX

编辑1
或者,有没有办法可以传递一个只包含我想要包含的属性的数组?

3 个答案:

答案 0 :(得分:195)

<强>动物内脏(列)

此方法旨在通过单个列执行select作为直接SQL查询返回具有指定列名称值的数组值与列具有相同的数据类型。

示例:

Person.pluck(:id) # SELECT people.id FROM people
Person.uniq.pluck(:role) # SELECT DISTINCT role FROM people
Person.where(:confirmed => true).limit(5).pluck(:id)

请参阅http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-pluck

它引入了rails 3.2以后只接受单列。在rails 4中,它接受多列

答案 1 :(得分:80)

在Rails 2中

l = Location.find(:id => id, :select => "name, website, city", :limit => 1)

...或...

l = Location.find_by_sql(:conditions => ["SELECT name, website, city FROM locations WHERE id = ? LIMIT 1", id])

This reference doc为您提供了可以与.find一起使用的完整选项列表,包括如何按编号,ID或任何其他任意列/约束进行限制。

在Rails 3中使用ActiveRecord查询接口

l = Location.where(["id = ?", id]).select("name, website, city").first

参考:Active Record Query Interface

您还可以交换这些链式调用的顺序,执行.select(...).where(...).first - 所有这些调用都是构造SQL查询然后将其发送出去。

答案 2 :(得分:11)

我的回答很晚,因为我是一个非常新的开发人员。这就是你能做的:

Location.select(:name, :website, :city).find(row.id)

顺便说一句,这是 Rails 4