[英]convert named_scope for rails 3
我有以下代码会导致Rails 3抛出错误:
module Auditions
module Search
def self.included(base)
base.extend ClassMethods
...
base.named_scope :not_rated_by, lambda { |user_id| {
:conditions => ['NOT EXISTS (SELECT * FROM audition_tags bar WHERE bar.user_id = ? AND bar.audition_id = auditions.id)', user_id]
}}
...
end
end
end
调用时出现以下错误:
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
如您所见,好像user_id现在是一个包含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而不是一个Array:
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,但输出了一个类型为Array的数组:[ActiveRecord :: Relation,FixNum]
update4:我终于找到了解决方案(但不确定为什么吗 ?)
我用“发送”代替了“通话”,它的工作原理是...
results = scopes.inject(self) do |combined_scope, scope|
combined_scope.send(scope[0], scope[1])
end
感谢你的帮助 !
尝试这个:
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)
}
顺便说一句,可能是这里缺少逗号了,在Audition_tags和bar之间应该放些东西吗?
FROM audition_tags bar
而且还可根据您的错误,我想你传递一个用户对象-不是一个ID,记得在Rails 3中一切都是ActiveRecord的关系,所以你必须调用first
或all
先上的关系才能获得结果。
例:
user = User.where('conditions').first
Auditions.not_rated_by(user.id)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.