2010-10-26 5 views
-1

J'ai le code suivant Wich renvoie une erreur avec Rails 3:convertir named_scope pour rails 3

Lorsqu'il est appelé l'erreur suivante apparaît:

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 

Comme vous pouvez le voir est comme user_id est maintenant une table contenant un objet ActiveRelation et bien ... mon user_id

Je ne comprends pas ce qui se passe ... avez-vous une idée?

Merci

mise à jour: est ici la sortie SQL complète:

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: est ici le code appelant mon champ https://gist.github.com/ddddfeddf70264a81289

Update3: comme vous pouvez le voir dans mon essentiel les portées chaînées sont appelées avec un "appel":

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

Si je me connecte l'user_id envoyé c'est un FIXNUM pas un tableau:

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 

Le problème est plus précis maintenant: j'envoyer un Fixnum comme argument à mon named_scope mais obtenu sur la sortie d'un tableau de Type: [ActiveRecord :: Relation, FIXNUM]

Update4: enfin je trouve la solution (mais ne sais pas pourquoi ???)

j'ai remplacé "appel" par "envoyer" et wo rks ...

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

Merci à tous pour votre aide!

+0

Je ne sais pas, mais ne devrait pas 'DE audition_tags bar WHERE' être' DE audition_tags AS bar WHERE' - Avis de la 'AS' – Ariejan

+0

Non, vous ne devez pas, autant que je sache, il est facultatif – Mike

+0

Comment le SQL complet est-il généré? – shingara

Répondre

2

Essayez ceci:

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) 
} 

Et par ailleurs, pourrait-il qu'il ya une virgule manquante ici, quelque chose devrait aller bewtween audition_tags et bar?

FROM audition_tags bar 

Et aussi en fonction de votre erreur, je pense que vous passez dans un objet utilisateur - pas d'ID, souvenez-vous dans Rails 3 tout est une relation ActiveRecord de sorte que vous devez appeler first ou all sur la relation premier à obtenir un résultat.

Exemple:

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

Salut Max J'ai essayé de convertir mon named_cope à la portée que vous avez mentionné, mais j'ai eu la même erreur exacte. Pour "FROM audition_tags barre" vous pouvez vérifier la syntaxe SQL c'est équivalent à "FROM audition_tags AS barre" et non je passe un user_id pas un objet qui est la chose étrange (je l'ai même inspecté et avant d'entrer dans la portée c'est un FixNum) ... – Mike

+0

'# ', 2053809816 ressemble à votre passage quelque chose de pas entier? –

+0

J'ai mis à jour la question – Mike

Questions connexes