2010-10-26 69 views
-1

我有以下代碼至極投用Rails 3的一個錯誤:正如你可以看到它像user_id是轉換named_scope鋼軌3

Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2053809816 AND audition_tags.audition_id = auditions.id)) ORDER BY auditions.cr' at line 1: SELECT  `auditions`.* FROM  `auditions` WHERE  (NOT EXISTS (SELECT * FROM audition_tags WHERE audition_tags.user_id = '#<ActiveRecord::Relation:0x104ee3c20>',2053809816 AND audition_tags.audition_id = auditions.id)) ORDER BY auditions.created_at DESC LIMIT 0, 10 

調用時出現以下錯誤現在一個表包含一個ActiveRelation對象,以及...我的user_id

我不明白髮生了什麼...你有什麼想法嗎?

感謝

更新:這裏是完整的SQL輸出:

SELECT `auditions`.* FROM `auditions` WHERE (NOT EXISTS (SELECT * FROM audition_tags as bar WHERE bar.user_id = '#<ActiveRecord::Relation:0x104aa6c48>',2053809816 AND bar.audition_id = auditions.id)) ORDER BY auditions.created_at DESC LIMIT 0, 10 

UPDATE2:這裏是叫我的範圍代碼https://gist.github.com/ddddfeddf70264a81289

UPDATE3:正如你所看到的我的要點鏈接的示波器被稱爲「呼叫」:

scopes.inject(self) {|m,v| m.scopes[v[0]].call(m, v[1]) } 

如果我登錄的USER_ID送它一個Fixnum不是數組:

scopes.inject(self) do |m,v| 
    logger.info ">>> SCOPE : #{v[0].inspect} | ARG : #{v[1].inspect} | ARG CLASS : #{v[1].class.inspect} <<<" 
    m.scopes[v[0]].call(m, v[1]) 
end 

所以,現在的問題是更精確:我送一個Fixnum作爲參數傳遞給我的named_scope但得到的輸出數組類型:ActiveRecord的::關係,Fixnum對象]

UPDATE4:我終於找到解決辦法(但不知道爲什麼???)

我取代 「呼」 的 「送」,它をrks ...

results = scopes.inject(self) do |combined_scope, scope| 
    combined_scope.send(scope[0], scope[1]) 
end 

謝謝大家的幫忙!

+0

不知道,但不應該'FROM audition_tags酒吧WHERE'是'FROM audition_tags,酒吧WHERE' - 注意'AS' – Ariejan 2010-10-26 15:13:00

+0

不,你並不需要,據我所知它是可選 – Mike 2010-10-26 15:18:12

+0

完整的SQL如何生成? – shingara 2010-10-26 15:25:44

回答

2

試試這個:

scope :not_rated_by, lambda { |user_id| { 
    where('NOT EXISTS (SELECT * FROM audition_tags bar WHERE bar.user_id = ? AND bar.audition_id = auditions.id)', user_id) 
} 

順便說一句,這可能是因爲有一個逗號缺少在這裏,事情應該去bewtween audition_tags和酒吧?

FROM audition_tags bar 

而且還可根據您的錯誤,我想你傳遞一個用戶對象 - 不是一個ID,記得在Rails 3中一切都是ActiveRecord的關係,所以你要叫上關係firstall率先獲得結果。

例子:

user = User.where('conditions').first 
Auditions.not_rated_by(user.id) 
+0

您好,我試圖將我的named_cope轉換爲您提到的範圍,但我得到了相同的確切錯誤。對於「FROM audition_tags bar」,你可以檢查SQL語法,它等價於「FROM audition_tags AS bar」,並且不傳遞一個user_id而不是一個奇怪的東西(我甚至檢查過它,並且在進入範圍之前它是一個FixNum )... – Mike 2010-10-26 15:48:41

+0

'#',2053809816確實看起來像你傳遞的東西不是整數? – 2010-10-26 15:52:45

+0

我更新了問題 – Mike 2010-10-26 16:19:13