2014-03-26 62 views
1

這是我的範圍。如何在rails範圍內編寫原始sql?

scope :abc, -> (start_date, end_date) { 
    find_by_sql("select * from xys where created_at >= '#{start_date}' and created_at <= '#{end_date}'") 
} 

當我使用以下命令執行上述範圍時,它返回空白數組。

XYZ.abc(start_date, end_date) 

上面的命令生成正確的sql,我可以在日誌中看到。當我將這個sql執行到mysql時,它會返回數據。

我知道如何寫在這裏與範圍的選擇,在這裏等幫助...

的問題是,我想寫的範圍內純SQL。我怎麼寫這個?

+2

爲什麼你想要範圍內的原始sql? – emaillenin

+0

什麼是處理原始sql的更好方法? –

+0

如果你真的要從模型表中選擇,爲什麼你需要原始的sql?如果它要連接多個表,請使用視圖。 – emaillenin

回答

2

正確的方法是使用下面的:

scope :abc, ->(start_date, end_date) { 
    where("created_at >= ? AND created_at <= ?", start_date, end_date) 
} 

通過調用find_by_sql你的ActiveRecord混合的範圍界定系統與find_by_sql方法(我只推薦用於複雜的SQL,這你是不是)。

範圍確定實際上是框架的優勢之一(例如,您可以輕鬆地將它們組合在一起Object.abc(date, date).some_other_scope以創建可讀查詢)。因爲你沒有確定範圍,所以沒有模型爲你實例化,並且數據庫不會立即被查詢(它允許你鏈接作用域)。一個範圍方法通常返回一個ActiveRecord :: Relation :: ActiveRecord_Relation_ [Classname]而不是一個數組。