ActiveRecord查找并仅返回选定的列


88

编辑2

如果您偶然发现此问题,请同时检查两个答案,因为我现在会为此使用pluck


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

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

但我想做这样的事情:

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

但这似乎不起作用。我将如何使其工作?

谢谢

编辑1
或者,是否可以传递仅包含要包含的属性的数组?

Answers:


85

在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])

该参考文档为您提供了可以使用的选项的完整列表.find,包括如何通过数字,id或任何其他任意列/约束来限制。

在带有ActiveRecord查询界面的Rails 3中

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

参考:活动记录查询界面

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


但我只想要一个实例,而不是全部

我编辑了答案。:limit要做到这一点,或:first:last或什么取决于你想要什么。我链接到的参考文档将告诉您如何执行所有操作。
jefflunt

更新以包括如何在Rails 3中进行等效查询
。– jefflunt 2012年

204

拔(column_name)

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

例子:

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

它引入了3.2或更高版本的导轨,仅接受单列。在rails 4中,它接受多列


1
好的,选择多列是很棒的..刚刚在此答案上获悉。尽管Rails 3需要接受的答案。
杰伊·谢泼德

公认的答案是正确的,因为当时无法使用。
prasad.surase 2014年

User.pluck(:email,:id)从 “ users”中选择“ users”。“ email”,“ users”。“ id”
pranav prashant

2
Model.uniq现在是Model.distinct(至少在Rails 5中)。
mrturtle

似乎可以在rails 3.2中执行以下操作:Location.select([:name, :website, :city])如果将其传递给数组
CTS_AE

21

我的答案来得很晚,因为我是一个相当新的开发人员。您可以执行以下操作:

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

顺便说一句,这是Rails 4


这应该是选定的答案,最直接地回答问题。
Michael Wiltbank
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.