如何查询ActiveModel记录的子集?

时间:2014-12-15 18:41:51

标签: ruby-on-rails database ruby-on-rails-4 activerecord arel

我已经改写了这个问题,因为我之前的解释引起了混乱。

在SQL世界中,您有一个应用查询的初始记录集。此查询的输出是结果集。通常,初始记录集是整个记录表,结果集初始记录集中与查询规则集匹配的记录

我有一个用例,我需要我的应用程序偶尔只对表中的一部分记录进行操作。如果一个表中有10,000条记录,我希望我的应用程序只能存在前1000条记录。这些应该是每次相同的1,000条记录。换句话说,我希望初始记录集是表中的前1,000个设备(按主键排序时),而结果集是这些设备的结果记录前1,000台设备。

已经提出了一些解决方案,并且揭示了我的初步描述并不十分清楚。更明确一点,我并不是想实现分页。我也没有试图限制我收到的结果数量(.limit(1,000)确实会达到的结果)。

谢谢!

3 个答案:

答案 0 :(得分:-1)

这是您不明白的问题:

  

这会导致两个调用出现问题,因为限制会限制查询结果,而不是执行查询的数据库行。

这不是Rails的事情,这是一个SQL的事情。

Device.limit(n)运行SELECT * FROM device LIMIT n

Limit始终返回查询结果集的子集。

first(n)会完成你想要的吗?它将按PK对结果集进行排序,并限制返回的结果数。

答案 1 :(得分:-1)

SQL语句可以链接在一起。因此,如果您有子集,则可以使用它执行其他查询。

my_subset = Device.where(family: "Phone")
# SQL: SELECT * FROM Device WHERE `family` = "Phone"

my_results = my_subset.where(style: "Touchscreen")
# SQL: SELECT * FROM Device WHERE `family` = "Phone" AND `style` = "Touchscreen"

也可以写成:

my_results = Device.where(family: "Phone").where(style: "Touchscreen")
my_results = Device.where(family: "Phone", style: "Touchscreen")
# SQL: SELECT * FROM Device WHERE `family` = "Phone" AND `style` = "Touchscreen"

根据您的问题,如果您想要选择前1,000行(按主键排序pkey)然后再查询,则需要执行以下操作:

my_results = Device.find_by_sql("SELECT * 
                           FROM (SELECT * FROM devices ORDER BY pkey ASC LIMIT 1000) 
                           WHERE `more_searching` = 'happens here'")

答案 2 :(得分:-2)

您可以专门询问一组ID:

Device.where(id: (1..4).to_a)

这将构建一个WHERE子句,如:

WHERE id IN (1,2,3,4)