[英]Using Named Scopes as Subqueries in Rails
在我的Rails應用程序中,我想將一個表與另一個表的命名范圍連接起來。 有沒有一種方法可以不必為我的join語句重寫純SQL中的命名作用域?
基本上,有沒有辦法做這樣的事情?
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
您可以使用merge
方法將范圍merge
到另一個模型的查詢中:
Bar.joins(:foos).merge(Foo.updated_today)
我還沒有看到大量的文檔(Rails API甚至沒有關於方法本身的任何文檔),但是這里有一個相當不錯的博客文章,給出了一個相當詳細的示例。
另外,只是注意到在Rails 3的高級查詢中的RailsCast中提到了這一點。
我不相信有專門為此設計的方法。 但是,可以使用ActiveRecord::Relation
的to_sql
方法以字符串的形式獲取范圍的完整SQL查詢,然后可以將其用作join語句中的子查詢,如下所示:
Bar.joins("INNER JOIN (#{Foo.updated_today.to_sql}) as t0 ON bar_id = bars.id")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.