конвертировать named_scope для рельсов 3 - PullRequest
0 голосов
/ 26 октября 2010

У меня есть следующий код, который выдает ошибку с 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, а не массив:

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 :: Relation, FixNum]

update4: Я наконец-то нашел решение (но не уверен, почему ???)

Я заменил «вызов» на «отправить», и он работает ...

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

Спасибо всем за помощь!

1 Ответ

2 голосов
/ 26 октября 2010

Попробуйте это:

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 Relation, поэтому вы должны сначала вызвать first или all для отношения, чтобы получить результат.

Пример:

user = User.where('conditions').first
Auditions.not_rated_by(user.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...