获得Rails第一条记录“id”的最有效方法

时间:2015-10-03 18:26:44

标签: ruby-on-rails-4 activerecord

我正在审核一些代码,但我遇到了一行代码:

Person.find_by(name: "Tom").id

上面的代码获取名为“Tom”的FIRST记录,然后构建模型,然后获取该模型的id。由于我们只需要id,因此不需要在模型中检索所有数据并初始化模型的过程。使用活动记录查询优化此方法的最佳方法是什么?

我想避免使用原始的sql解决方案。到目前为止,我已经能够提出:

Person.where(name: "Tom").pluck(:id).first

在某些情况下,这会更快,因为pluck不会构建实际的模型对象,也不会加载所有数据。但是,pluck将构建名为“Tom”的记录数组,而原始语句只返回单个对象或nil - 因此根据where语句,此技术可能会更糟。我想避免创建数组,并有可能从服务器返回一个很长的id列表。我可以在链中添加limit(1)

Person.where(name: "Tom").limit(1).pluck(:id).first

但似乎我让它变得比它应该更复杂。

3 个答案:

答案 0 :(得分:1)

这有点冗长,但您可以使用ActiveRecord连接中的select_value,如下所示:

Person.connection.select_value(Person.select(:id).where(name: 'Tom').limit(1))

答案 1 :(得分:1)

在Rails 6中,您可以使用新的pick method

Person.where(name: 'Tom').pick(:id)

答案 2 :(得分:0)

这可能有效,具体取决于您要查找的内容。

Person.where(name: "Tom").minimum(:id)
Person.where(name: "Tom").maximum(:id)

这些将按id值进行排序,而Person.where(name: "Tom").first.id将根据您的默认排序进行排序。可以是id,created_at或primary_key。

无论如何都要测试,看看它是否对您有用