2012-08-09 76 views
2

在我的Rails應用程序中,我想要連接一個表與另一個表的命名作用域。有沒有辦法做到這一點,而不必爲我的聯合聲明重寫純SQL中的命名範圍?在Rails中使用命名作用域作爲子查詢

基本上,有沒有辦法做這樣的事情?

class Foo < ActiveRecord::Base 
    scope :updated_today, where('updated_at > ?', DateTime.now.prev_day) 
end 

Bar.joins(Foo.updated_today) 

凡Bar.joins生成以下SQL:

SELECT * FROM bars 
INNER JOIN 
    (SELECT * FROM foos WHERE updated_at > 2012-8-9) AS t0 
ON bar_id = bars.id 

回答

1

我不相信有任何專門爲此設計的方法。你可以,但是,使用的ActiveRecord::Relationto_sql方法來獲取範圍完整的SQL查詢語句的字符串,它可以作爲一個子查詢的連接語句,然後使用,就像這樣:

Bar.joins("INNER JOIN (#{Foo.updated_today.to_sql}) as t0 ON bar_id = bars.id") 
+0

是的,我只是回答我自己的問題。如果有人有這樣做的更好的方式,但請隨時chime英寸 – Ajedi32 2012-08-09 17:50:26

+1

完全可以接受回答你自己的問題,特別是當我們其他人似乎無法這樣做... :) – BaronVonBraun 2012-08-09 17:53:11

2

可以使用merge方法來連接到示波器另一種模式的查詢:

Bar.joins(:foos).merge(Foo.updated_today) 

我還沒見過(Rails API甚至沒有關於該方法本身的任何文檔),但這裏有一個相當不錯的blog post給出了一個相當詳細的例子。

此外,只是注意到這是在一個RailsCast上提到Advanced Queries in Rails 3

+1

這真的很有趣,但它不是我想要的。我不想將範圍加入到查詢中,我想使用作用域生成的查詢作爲子查詢,我可以調用LEFT OUTER JOIN。 (我會更新問題以使其更清楚。) – Ajedi32 2012-08-09 16:55:21