0

样本:

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,正如我所期待的。

为什么会这样?有什么办法可以解决这个问题吗?

4

1 回答 1

1

update_all仅从查询中获取约束并忽略groupandhaving子句。

这里是源代码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子句对这些记录执行

于 2013-09-09T14:24:58.067 回答