我正在嘗試基於關聯中的查詢進行復雜的搜索。Active Record:基於關聯中的另一個查詢的查詢
事件belongs_to的:用戶/用戶的has_many:事件
伴隨的文字行:
query = User.where(:name => 'Bob')
query = query.joins(:events).where('COUNT(events.start_at > #{Time.now}) = 0')
我嘗試了好幾種方法,但似乎沒有工作。非常感謝。
在此先感謝。
我正在嘗試基於關聯中的查詢進行復雜的搜索。Active Record:基於關聯中的另一個查詢的查詢
事件belongs_to的:用戶/用戶的has_many:事件
伴隨的文字行:
query = User.where(:name => 'Bob')
query = query.joins(:events).where('COUNT(events.start_at > #{Time.now}) = 0')
我嘗試了好幾種方法,但似乎沒有工作。非常感謝。
在此先感謝。
您需要使用scopes允許這種鏈接的:
在用戶模式:
scope :with_name, lambda { |name| where(:name => name) }
在代碼:
query = User.with_name('Bob')
query = query.joins(:events).where('COUNT(events.start_at > #{Time.now}) = 0')
我注意到的幾個問題與方法你查詢被寫入,但我不認爲修復它們將解決您的問題。所有這一切,希望知道這件事會讓你更接近!
首先,你需要以雙引號,以獲得紅寶石尊重你的#{}插值:
打開IRB和嘗試:
1.9.3p194 :001 > 'COUNT(events.start_at > #{Time.now}) = 0'
將輸出:
"COUNT(events.start_at > \#{Time.now}) = 0"
請注意,沒有改變,因爲我們有單引號。
現在讓我們用雙引號嘗試,我們是有點接近:
1.9.3p194 :002 > "COUNT(events.start_at > #{Time.now}) = 0"
這一次,我們看到:
"COUNT(events.start_at > 2012-09-24 14:47:52 -0700) = 0"
但是,這仍然無法工作,因爲SQL要報價圍繞您的時間戳進行比較。
我們可以手動處理這個問題,像這樣:
1.9.3p194 :003 > "COUNT(events.start_at > '#{Time.now}') = 0"
產生:
"COUNT(events.start_at > '2012-09-24 14:49:31 -0700') = 0"
但事實可能並非對所有SQL工作 - 我知道的Postgres要圍繞文字單引號,但MySQL可能更喜歡雙引號,或者可能不重要。
處理這個問題的最好方法是讓Rails弄明白。我們這樣做的方式是使用?運營商我們的SQL查詢字符串裏:
where('COUNT(events.start_at > ?) = 0', Time.now)
和輸出Rails會產生,並傳送給你的SQL數據庫,將是這樣的:
"WHERE COUNT(events.start_at > '2012-09-24 14:49:31 -0700') = 0"
希望幫助!
我覺得這是你在一行找什麼都:
Event.joins(:user).where(:users => {:name => 'Bob'}, :events => {:start_at => Time.at(0)..Time.now })
不能在WHERE子句中使用COUNT afiak。您需要對結果進行分組,並使用條件僅返回所需的結果。
query = User.where(:name => 'Bob')
query = query.joins("LEFT JOIN (SELECT events.id FROM events WHERE events.start_at > '#{Time.now.to_s(:db)}') AS events ON events.user_id=users.id").group("users.id").where("events.id IS NULL")