繁体   English   中英

转换named_scope为rails 3

[英]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的关系,所以你必须调用firstall先上的关系才能获得结果。

例:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM