我有User
has_many
messages
。 我需要一個創建將ActiveRecord條件計數小於關聯
'Get me all users who's (message.opened == false) count < 3'
現在,我使用User.all
,通過所有用戶進行迭代,並手動計數的查詢。我明白這不是很有效,它可以在一個查詢中完成,但我是SQL/ActiveRecord的新手,所以需要一些幫助。 感謝
我有User
has_many
messages
。 我需要一個創建將ActiveRecord條件計數小於關聯
'Get me all users who's (message.opened == false) count < 3'
現在,我使用User.all
,通過所有用戶進行迭代,並手動計數的查詢。我明白這不是很有效,它可以在一個查詢中完成,但我是SQL/ActiveRecord的新手,所以需要一些幫助。 感謝
試試這個
User.includes(:messages).group('users.id').having('SUM(IFNULL(messages.opened = 0, 1)) < 3')
它的工作原理至少在MySQL,和假設你的邏輯真有1數據庫。
EDIT我已經扭轉的條件
PSIFNULL
是有處理如果messages.opened
可以NULL
假設導軌3的語法。你可以這樣做:
User.joins(:messages).where(:messages => {:opened => false}).group(:user_id).having("COUNT(messages.id) < 3)
這應該工作:
User.includes(:messages).group("users.id").where("messages.opened = 0").having("count(messages.id) < 3")
這將創建兩個查詢,一個是分組查詢,以及一個用於預先加載生成的用戶和消息與加盟。
這是解決問題的方法
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
不知道什麼時候改變了,但是通過Rails 5(也許是Rails 4.x),你應該使用''''eager_load'''代替''includes'''。 –
確定count屬性是否在您的模型中?我不明白你實際需要什麼?所有用戶的message.opened == false?點數在這裏的目的是什麼?請你解釋一下你需要的查詢 –