Active Record Query不会加载所有id

时间:2018-06-19 07:40:05

标签: ruby-on-rails postgresql ruby-on-rails-3 activerecord

我有一个像这样的活动记录查询:

House.where.not(id: Person.ill.pluck(:house_id))

当我在此查询上运行explain时,我看到所有ID都被加载到查询中:

Seq Scan on houses  (cost=0.00..4274.07 rows=1102 width=77)
 Filter: id <> ALL ('{1117,487,842,126,127,459,458,515,332,55,54,10,1697,449,448,1555,13,510,1986,8,9,7,6,5,1865,519,157,513,512,56,103,28,27,97,25,23,385,138,278,92,1,435,196,195,61,363,229,230,238,237,231,160,158,749,748,518,517,174,173,172,395,153,1170,207,206,276,199,198, ....

是否有更多的执行方法来实现相同的查询?没有加载所有ID?

2 个答案:

答案 0 :(得分:3)

尝试使用enter image description here,但您无法在此处重复ill范围。例如,如果此范围如下所示:

scope :ill, -> { where(status: 'ill') }

那么您的查询可能是这样的:

House.joins("JOIN persons ON houses.id = persons.house_id AND persons.status <> 'ill'")

答案 1 :(得分:3)

pluck立即运行其查询,因为它返回一个ID数组。

您可以使用select将结果保存为Relation,然后将其作为子查询就地使用:

House.where.not(id: Person.ill.select(:house_id))