【问题标题】:Most Efficient Way to get the "id" of the first record in Rails获取Rails中第一条记录的“id”的最有效方法
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这有点冗长,但您可以像这样在 ActiveRecord 连接中使用select_value

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

    【讨论】:

      【解决方案3】:

      这可能取决于您要查找的内容。

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

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

      无论哪种方式测试,看看它是否适合你

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-28
        • 1970-01-01
        • 2020-10-01
        • 2016-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多