Ruby on rails 4 获取;id";Rails中的第一条记录
我正在查看一些代码,发现一行代码执行以下操作:Ruby on rails 4 获取;id";Rails中的第一条记录,ruby-on-rails-4,activerecord,Ruby On Rails 4,Activerecord,我正在查看一些代码,发现一行代码执行以下操作: Person.find_by(name: "Tom").id 上面的代码获取名为“Tom”的第一条记录,然后构建一个模型,然后获取该模型的id。由于我们只需要id,因此不需要检索模型中的所有数据并初始化模型的过程。使用活动记录查询优化此功能的最佳方法是什么 我希望避免使用原始sql解决方案。到目前为止,我已经能够提出: Person.where(name: "Tom").pluck(:id).first 这在某些情况下更快,因为pulk不会构建
Person.find_by(name: "Tom").id
上面的代码获取名为“Tom”的第一条记录,然后构建一个模型,然后获取该模型的id。由于我们只需要id,因此不需要检索模型中的所有数据并初始化模型的过程。使用活动记录查询优化此功能的最佳方法是什么
我希望避免使用原始sql解决方案。到目前为止,我已经能够提出:
Person.where(name: "Tom").pluck(:id).first
这在某些情况下更快,因为pulk
不会构建实际的模型对象,也不会加载所有数据。然而,pluck
将构建一个名为“Tom”的记录数组,而原始语句只返回一个对象或nil-因此,根据where
语句,这种技术可能会更糟糕。我希望避免创建数组,避免从服务器返回很长的ID列表。我可以在链中添加一个限制(1)
Person.where(name: "Tom").limit(1).pluck(:id).first
但似乎我把这件事弄得比实际情况更复杂了。这有点冗长,但您可以从ActiveRecord连接使用如下内容:
Person.connection.select_value(Person.select(:id).where(name: 'Tom').limit(1))
使用Rails 6,您可以使用新的:
这可能会起作用,这取决于你在寻找什么
Person.where(name: "Tom").minimum(:id)
Person.where(name: "Tom").maximum(:id)
它们将按id
值排序,而Person.where(name:“Tom”).first.id
将按默认排序。可以是id、created\u at或primary\u key
另一种方法是测试并查看它是否适合您您也可以使用
select
仅选择要获取的列,因此:Person.select(:id)。find_by(name:“Tom”).id
这肯定是一个选项,尽管它仍然会导致不必要的对象创建。Rails需要一种类似于pulk\u first(:id)
的方法。
Person.where(name: "Tom").minimum(:id)
Person.where(name: "Tom").maximum(:id)