簡體   English   中英

在Rails中使用命名范圍作為子查詢

[英]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::Relationto_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM