样品:
a = Model.join("...").where("...").group("...")
b = Model.join("...").where("...").group("...").having("...")
如果我这样做:
a.class
给了我ActiveRecord :: Relation。与b.class
相同。
当我这样做时:
a.length
我得到 1000 。 b.length
我得到 50
最后,如果我这样做:
a.update_all(field:'...')
=> 1000
b.update_all(field:'...')
=> 1000
不是 50 ,正如我所料。
为什么会这样?有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
update_all
仅从您的查询中获取约束并忽略group
和having
子句。
以下是update_all
def update_all(updates)
.....
# HERE IS THE RELEVANT CODE
# It extracts only the constraints, limit and order clauses. It ignores the rest
stmt.take(arel.limit)
stmt.order(*arel.orders)
stmt.wheres = arel.constraints
.....
end
我想您必须分两步完成,使用having
子句执行查询并获取匹配的50条记录的列表ID,然后使用这些记录执行update_all
IN
条款