2012-02-22 60 views
1

我有以下的Rails查詢:如何在SQL中編寫以下Rails查詢?

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

由於種種原因,如性能,我需要在SQL寫這個,所以我可以執行SQL,而不是用戶的Rails進行更新。任何想法如何梳理軌道愛好者到SQL是可能的?

感謝

回答

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)