rails update_all for ActiveRecord Relation with' having'不工作

时间:2013-09-09 13:39:37

标签: mysql ruby-on-rails activerecord

样品:

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 ,正如我所料。

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

1 个答案:

答案 0 :(得分:1)

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

以下是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条款