2012-02-22 9 views
1

I以下Railsのクエリを持っています。さまざまな理由はどのようにSQLで次のRailsのクエリを書くことができますか?

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

は、パフォーマンスのように、私はSQLでこれを記述する必要がありますので、私は、更新を行うために、ユーザレールのSQLを実行し、することはできません。すべてのアイデアはどのようにSQLにレールロガーを梳くことは可能ですか?

おかげ

答えて

3

この:

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でそれをラップしました:一歩をアンロール

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

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

は基本的にこれを行います私たちはただSQLに反復を押して#{org.id}に対処する必要があります:あなたは本当にusers_count値ではなくインクリメントを設定することを意味している場合

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

をそしてそれら:

update orgs o 
set users_count = (select count(*) from org_users ou where ou.org_id = o.id) 
関連する問題