2012-09-24 286 views
2

我正在嘗試基於關聯中的查詢進行復雜的搜索。Active Record:基於關聯中的另一個查詢的查詢

事件belongs_to的:用戶/用戶的has_many:事件


伴隨的文字行:

query = User.where(:name => 'Bob') 
query = query.joins(:events).where('COUNT(events.start_at > #{Time.now}) = 0') 

我嘗試了好幾種方法,但似乎沒有工作。非常感謝。

在此先感謝。

回答

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') 
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" 

希望幫助!

0

我覺得這是你在一行找什麼都:

Event.joins(:user).where(:users => {:name => 'Bob'}, :events => {:start_at => Time.at(0)..Time.now }) 
0

不能在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")