2010-10-26 72 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