如何在执行 .limit() 后获取 activerecord 对象的子集?

how to get subset of activerecord objects after performing .limit()?

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

例如理想行为:

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

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

怎样才能得到想要的回复?

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

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

上面的查询只会在table的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