ActiveRecord查找并仅返回选定的列

110

编辑 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
或者,是否有一种方法可以传递一个仅包含我想要的属性的数组?

3个回答

221

pluck(column_name)

这个方法是为了通过单个列执行select查询而设计的,返回指定列名的值数组,其数据类型与列相同。

示例:

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

pluck方法从Rails 3.2开始引入,只接受单列。在Rails 4中,它接受多个列。


1
好的,使用多列pluck非常棒..我在这个答案中学到了这一点。不过Rails 3需要采纳的答案。 - Jay Shepherd
1
被接受的答案是正确的,因为当时没有pluck可用。 - Prasad Surase
SELECT "users"."email", "users"."id" FROM "users" User.pluck(:email,:id) - pranav prashant
2
Model.uniq现在变成了Model.distinct(至少在Rails 5中)。 - mrturtle
似乎在Rails 3.2中可以这样做:Location.select([:name, :website, :city]),如果你传递一个数组。 - CTS_AE

95

在 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或任意其他约束条件进行限制。

在Rails 3中使用ActiveRecord查询接口

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

参考资料:Active Record查询接口

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


但我只想要一个实例,而不是全部。 - timpone
我编辑了我的回答。:limit应该可以做到这一点,或者:first:last或其他,具体取决于您想要什么。我链接的参考文档将告诉您如何完成所有这些操作。 - jefflunt
更新内容包括如何在Rails 3中执行等效查询。 - jefflunt

49
我的回答来得很晚,但这是你可以做的:
Location.select(:name, :website, :city).find(row.id)

顺便说一下,这是Rails 4

3
这应该是所选答案并最直接地回答了问题。 - Michael Wiltbank
这个问题早在10年前就被问过了。Rails和ActiveRecord版本已经经历了重大变化。幸运的是,现在事情肯定变得更加简单了。这是我在现代时代会做的事情,但验证一下你正在运行的版本也不会有什么损失。 - CTS_AE
这就是方法 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接