【发布时间】:2015-10-03 18:26:43
【问题描述】:
我正在查看一些代码,我遇到了执行以下操作的一行:
Person.find_by(name: "Tom").id
上面的代码获取了名为“Tom”的第一条记录,然后构建了一个模型,然后获取了该模型的 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
但似乎我让这件事变得比应有的复杂。
【问题讨论】:
-
您也可以使用
select仅选择您想要获取的列:Person.select(:id).find_by(name: "Tom").id -
这绝对是一个选项,尽管它仍然会导致不必要的对象创建。 Rails 需要类似
pluck_first(:id)的方法。
标签: ruby-on-rails-4 activerecord