Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 获取;id";Rails中的第一条记录_Ruby On Rails 4_Activerecord - Fatal编程技术网

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)