如何在SQL中编写以下Rails查询?

时间:2012-02-22 05:25:26

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

我有以下Rails查询:

Org.find(:all).each do |org|
    Org.update_counters org.id, :users_count => org.users.length
end

由于各种原因,比如性能,我需要在SQL中编写它,因此我可以执行SQL,而不是用户Rails来进行更新。有关如何将rails loger整理成sql的任何想法都可以吗?

由于

1 个答案:

答案 0 :(得分:3)

此:

Org.update_counters org.id, :users_count => org.users.length

基本上这样做:

update orgs
set users_count = coalesce(users_count, 0) + #{org.users.length}
where id = #{org.id}

展开一步:

update orgs
set users_count = coalesce(users_count, 0)
                + (select count(*) from org_users where org_id = #{org.id})
where id = #{org.id}

现在你已将它包装在Org.find(:all).each中,所以我们只需将迭代推送到SQL并处理#{org.id}

update orgs o
set users_count = coalesce(users_count, 0)
                + (select count(*) from org_users ou where ou.org_id = o.id)

如果您真的想要设置 users_count值,而不是增加

update orgs o
set users_count = (select count(*) from org_users ou where ou.org_id = o.id)