2009-09-29 50 views
1

看完後,最新的RailsCasts用include和join信息,我知道我可以用更高效的方式做我正在做的事情。我有一個非常簡單的用戶模型和狀態模型。用戶屬於狀態,狀態有許多用戶。我需要計算有多少用戶具有特定類型的狀態,這會爲每個狀態創建一個新的SQL計數查詢,並且我知道這不是一個好辦法。它現在看起來像這樣。ActiveRecord通過兩個表格的條件進行計數

statuses = Status.all 

statuses.each do |status| 
    status.users.count 
end 

我結束了4個疑問:

SELECT count(*) AS count_all FROM "users" WHERE ("users".status_id = 1) 
SELECT count(*) AS count_all FROM "users" WHERE ("users".status_id = 2) 

它繼續這樣,對儘可能多的不同狀態如存在於數據庫中。最大的問題是,現在我需要由另一個組織進行篩選,這也是組織。所以我需要爲在某個組織中具有特定狀態的所有用戶查找計數。這最終使我的查詢量翻了四倍,感覺很糟糕。我不確定我可以用什麼樣的加入來減少這個問題,或者我可以做些什麼來解決這個問題。感謝您的幫助:)

回答

2

好了,所以我回答我的問題,以防萬一有人有同樣的問題。

Status.all(:joins => :users, 
      :select => "statuses.*, count(users.id) as users_count", 
      :group => "statuses.id") 

這會將具有用戶和用戶數的每個狀態返回爲users_count。爲了進一步優化查詢並僅對屬於某個組織的用戶進行計數,查詢將更改爲此。

Status.all(:joins => :users, 
      :select => "statuses.*, count(users.id) as users_count", 
      :conditions => {:users => {:organization_id => ORG_ID_HERE}}, 
      :group => "statuses.id") 

我希望這可以幫助任何人有同樣的問題,並感謝Eimantas和Ryan Bates(RailCasts)。

1

你可以試試簡單的SQL:

SELECT s.name,COUNT(u.id) AS users_count FROM statuses s, users u WHERE s.id=u.status_id GROUP BY s.id;

+0

您的評論激發了我尋找最終解決方案,謝謝:) – ohdeargod 2009-09-29 18:45:27

0

出於興趣,您的狀態模型包含什麼?它真的需要成爲自己的模型嗎?我在這裏猜測,但你可能要考慮實施finite state machine。有很多軌道插件可以很容易地實現FSM,例如acts_as_state_machine

相關問題