2013-08-06 45 views
0

我有包括statings的問題。Rails模型 - User.includes(:profile)

我的搜索模式是這樣的:

users = User.includes(:profile) 
users = users.active 
users = users.where('users.age = ?', value) 
users = users.where('profiles.abc = ?',value2) 

我的用戶模型:

scope :active, where('users.has_photo = ?', true) 

這是怎麼回事。當我還沒有在搜索模式'users = users.active' - 一切正常。左外部連接已完成。爲什麼這個「額外」的聲明破壞左外連接?即時通訊新的在rails和sql soo也許這是非常簡單的。

當我還沒有得到用戶= users.active - 查詢是這樣

SELECT COUNT(DISTINCT "users"."id") FROM "users" LEFT OUTER JOIN "profiles" ON "profiles"."user_id" = "users"."id" WHERE (profiles.age >= '15') AND (profiles.age <= '75') AND (profiles.gender IN(1,2)) - this is query when everything works. 

,並與用戶= users.active

SQLite3::SQLException: no such column: profiles.age: SELECT COUNT(*) FROM "users" WHERE (users.has_photo = 't') AND (profiles.age >= '21') AND (profiles.age <= '35') AND (profiles.gender IN(1,2)) 

has_photo僅僅是我打電話的時候,用戶添加的方法照片:

def set_active(value) 

    self.has_photo = value 

    end 
+0

這應該起作用。我只是測試了一些非常相似的東西,它按照你的意圖工作。你可以發佈你的'用戶'模型嗎?具體來說,引用'has_photo'的部分? –

+0

如何向我們展示有和沒有的查詢。 –

+0

SELECT COUNT(DISTINCT「users」。「id」)FROM「users」LEFT OUTER JOIN「profiles」ON「profiles」。「user_id」=「users」。「id」WHERE(profiles.age> ='15') AND(profiles.age <='75')AND(profiles.gender IN(1,2)) - 這是一切正常時的查詢。 – nowy2781

回答

0

我不明白你爲什麼要在一個新行中添加每個語句而不僅僅是鏈那麼這樣的:

users = User.includes(:profile).active.where('users.age = ? AND profiles.abc = ?', value, value2) 

應該沒有任何問題,工作

編輯: 給出您的意見,我認爲,你應該改變的範圍是一個Proc

scope :active, Proc.new { where(:has_photo => true) } 

我不知道原因在於Rails 4的所有範圍都需要Proc,所以必須有一個!

編輯:stevanity這個主題

那麼對於需要特效或lambda表達式或簡單的塊{}是 避免查詢急於評價的原因更多的見地。當模型首次被加載時,這些查詢將被評估爲 。因此,如果您有 指定的條件實際上是動態的,如where(:created_at => Date.today),那麼它總是會返回在特定應用程序啓動當天創建的記錄!爲了避免這一切,Rails4 要求作用域具有可調用的proc/function/block/lambda作爲 參數,以便在需要時調用和評估它們。

+0

因爲我有users = users.where(「profiles.age <=?」,age_to)if age_to.present? – nowy2781

+0

好的,如果你鏈接前兩個並添加另外兩個新行,那會發生?請更新您的代碼以反映實際邏輯,這可能很重要 –

+0

第二件事 - 當我這樣做users = users.where('users.has_photo =?',true)而不是users = users.active - 它的作用 – nowy2781