2011-04-27 68 views
3

有沒有辦法讓sql只是一個範圍?所以我想做類似的事情:Rails 3從範圍得到sql

class Presentation < ActiveRecord::Base 
     has_many :calls 
     has_many :recordings, :through => :calls 

     scope :with_recordings, joins(:calls).joins(:recordings) 
    end 

然後就可以得到該範圍的SQL。

Presentations.with_recordings.sql返回整個sql語句,包括SELECT語句。我想要的只是示波器添加的sql。圖中應該有一種方法來做到這一點。

回答

0

這沒有什麼意義,因爲沒有標準的方法來表示SQL「片段」。

可以被範圍添加和操作的不同種類的SQL「片段」實際上並沒有一種乾淨的方式來表示它們本身,而不是一個完整的SQL語句的一部分。一個片段可以是「JOIN用戶ON users.id = orders.user_id」或者它可以是「WHERE active = 1」。如果不將它們作爲完整的SQL語句的一部分,你將如何返回這些數據?這很可能是爲什麼除了您已經發現的只返回完整的SQL語句之外,沒有其他機制可以檢索它們。

3

我同意ctcherry關於這不是非常有用,但說了這麼多,我需要爲我正在開發的一個項目做到這一點。我們需要在範圍中複製sql以允許我們在不同類型的搜索中重用sql。相反,必須在兩個不同的地方維護相同的SQL,我選擇從範圍中提取SQL。

下面的代碼是我想出來的。這是醜陋的,但在Rails 3.0下工作

def extract_named_scope_clause(scope, args) 
    # where_clauses will return an array of clauses for an entire relationship. 
    # As this is only run a single scope, we only ever care about the first..... 
    clause, *bind_vars = self.send(scope, args).where_clauses.first 
    # prefix 'and ' to the string, add some spaces and append any bind variables 
    if clause 
     [" and #{clause} ", bind_vars] 
    else 
     nil 
    end 
    end 
+0

關閉,但我真正需要的是完整的聲明,而不僅僅是where子句。在這種情況下,我正在專門處理連接,所以'where_clauses'並沒有真正的幫助。 – Lukas 2012-01-13 20:16:05