Как вы можете написать следующий Rails Query на SQL? - PullRequest
1 голос
/ 22 февраля 2012

У меня есть следующий Rails Query:

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

По разным причинам, например, по производительности, мне нужно написать это в SQL, чтобы я мог выполнять SQL, а не пользовательский Rails для обновления.Любые идеи, как можно объединить рельсы Loger в SQL?

Спасибо

1 Ответ

3 голосов
/ 22 февраля 2012

Это:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...