2012-11-28 64 views
2

我有Userhas_manymessages。 我需要一個創建將ActiveRecord條件計數小於關聯

'Get me all users who's (message.opened == false) count < 3'

現在,我使用User.all,通過所有用戶進行迭代,並手動計數的查詢。我明白這不是很有效,它可以在一個查詢中完成,但我是SQL/ActiveRecord的新手,所以需要一些幫助。 感謝

+0

確定count屬性是否在您的模型中?我不明白你實際需要什麼?所有用戶的message.opened == false?點數在這裏的目的是什麼?請你解釋一下你需要的查詢 –

回答

0

試試這個

User.includes(:messages).group('users.id').having('SUM(IFNULL(messages.opened = 0, 1)) < 3') 

它的工作原理至少在MySQL,假設你的邏輯真有1數據庫。

EDIT我已經扭轉的條件

PSIFNULL是有處理如果messages.opened可以NULL

0

假設導軌3的語法。你可以這樣做:

User.joins(:messages).where(:messages => {:opened => false}).group(:user_id).having("COUNT(messages.id) < 3) 
0

這應該工作:

User.includes(:messages).group("users.id").where("messages.opened = 0").having("count(messages.id) < 3") 

這將創建兩個查詢,一個是分組查詢,以及一個用於預先加載生成的用戶和消息與加盟。

0

這是解決問題的方法

User.includes(:messages).group("users.id").where("messages.opened = 0").having("count(messages.id) < 3") 

,但你還能做的就是創造這個

scope :not_opened_less_three_count, includes(:messages).group("users.id").where("messages.opened = 0").having("count(messages.id) < 3") 

一個範圍,那麼你可以使用任何你需要的是遵循

User.not_opened_less_three_count 
+0

不知道什麼時候改變了,但是通過Rails 5(也許是Rails 4.x),你應該使用''''eager_load'''代替''includes'''。 –