【问题标题】:how to get subset of activerecord objects after performing .limit()?执行 .limit() 后如何获取活动记录对象的子集?
【发布时间】:2019-07-27 14:26:38
【问题描述】:

我希望能够将返回的 activerecord 对象限制为 20 个,然后执行 where() 返回有限对象的子集,我目前知道只有 10 个满足第二列条件。

例如理想行为:

o = Object.limit(20)
o.where(column: criteria).count
=> 10

但是,activerecord 仍然会查找 20 个满足 where() 条件的对象,但会查找 limit() 会自行返回的原始 20 个对象之外的对象。

我怎样才能得到想要的响应?

【问题讨论】:

    标签: ruby-on-rails where limit


    【解决方案1】:

    减少搜索空间的一种方法是使用嵌套查询。您应该搜索前 N 条记录,而不是匹配特定条件的所有记录。在 SQL 中,这将是这样完成的:

    select * from (select * from table order by ORDERING_FIELD limit 20) where column = value;
    

    上面的查询只会从表中搜索 20 行中的条件。请注意我是如何添加 ORDERING_FIELD 的,这是必需的,因为每次运行时每个查询都可能为您提供不同的顺序。

    要在 Rails 中执行类似的操作,您可以尝试以下操作:

    Object.where(id: Object.order(:id).limit(20).select(:id)).where(column: criteria)
    

    这将执行类似于以下的查询:

    SELECT [objects].* FROM [objects] WHERE [objects].[id] IN (SELECT TOP (20) [objects].[id] FROM [objects] ORDER BY [objects].id ASC) AND [objects].[column] = criteria
    

    【讨论】:

      猜你喜欢
      • 2011-11-17
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多