2010-12-01 4 views
1

J'ai une condition Ruby on Rails qui fonctionne dans MySQL, mais pas dans PostgresPGError: ERREUR: erreur de syntaxe à ou près E'String »

:conditions => ["A between ? and ? and B between ? and ? and C between ? and ? and ddd is ?",@amin,@amax,@bmin,@bmax,@cmin,@cmax,params[:input].to_s] 

génère l'erreur:

ActiveRecord::StatementInvalid (PGError: ERROR: syntax error at or near "E'word'" 
LINE 1: ...c between -100 and 100 and ddd is E'word') 

I sachez que cela fonctionne sans la dernière comparaison. Par exemple. Ddd est de type: string alors que a, b et c sont tous: décimal.

:conditions => ["A between ? and ? and B between ? and ? and C between ? and ?",@amin,@amax,@bmin,@bmax,@cmin,@cmax] 

Après avoir fait quelques recherches sur Postgresql, il semble que les chaînes E 'sont des chaînes échappées - cela ne m'aide pas car je n'arrive pas à le corriger. Je ne travaille pas très souvent avec le Postgresql donc je m'excuse d'avance si c'est quelque chose d'évident. J'utilise heroku pour l'hébergement, donc je ne peux pas modifier les paramètres Postgresql. Quoi qu'il en soit, je préférerais vraiment comprendre quel est le problème et comment le réparer.

Cheers, Stu

Répondre

3

Essayez de changer

ddd is ? 

dans

ddd = ? 
+0

C'est tout - parler de se sentir comme un idiot - acclame. – Stu

2

je crois que l'opérateur IS ne peut pas être utilisé pour comparer les valeurs de texte. Quelle était votre intention pour cela?

+0

J'utilise 'is' car il reste lisible et fonctionne avec MySQL, mais je pourrais utiliser l'opérateur = aussi facilement. Je vais essayer ça - bravo pour le pourboire. – Stu

+0

Cela ne fonctionne pas dans MySQL dans votre situation, c'est un opérateur booléen et non un opérateur de chaîne: http://dev.mysql.com/doc/refman/5.5/fr/comparison-operators.html#operator_is C'est un bug dans votre code. –

+0

Hmmm, vous avez raison, c'était sqlite3 comme le développement db. – Stu

0

avez-vous essayé et ddd =? par opposition à est?

:conditions => ["A between ? and ? and B between ? and ? and C between ? and ? and ddd = ?",@amin,@amax,@bmin,@bmax,@cmin,@cmax,params[:input].to_s]