2010-12-06 4 views
0

façon Hash fonctionne très bien:À propos des méthodes de requêtes conditions dans Rails 3

drummers = Drummer.where(:gender => true) 

=> [#<Drummer id: 1, first_name: "Bernard", middle_name: nil, second_name: "Purdie", nick_name: "Pretty Purdie", gender: true, created_at: "2010-12-05 02:47:56", updated_at: "2010-12-05 02:50:42">] 

Mais la même chose dans le sens chaîne:

drummers = Drummer.where("gender = true") 

je me suis ci-dessous erreur: A ctiveRecord :: StatementInvalid: SQLite3 :: SQLException: aucune colonne de ce type: TRUE: SELECT "batteurs". * FROM "batteurs" WHERE (gender = TRUE)

quelqu'un pourrait me dire pourquoi?

Répondre

0

Il s'agit d'une erreur sqlite, pas de rails. Quand vous dites gender = true, vous cherchez une colonne qui s'appelle true. Sqlite n'a pas de booléen, donc la manière correcte de le faire est Drummer.where("gender = 1").

0

Vous devriez éviter d'utiliser des chaînes si possible dans vos requêtes Arel.

Si vous vous joignez à une table qui contient également un champ nommé 'gender', cela va se casser, parce que c'est ambigu. L'utilisation de where(:gender => true) sera automatique pour vous, ce qui ne se produira pas. Comme le montre votre exemple, l'utilisation de chaînes peut également créer des problèmes de portabilité si vous utilisez une fonctionnalité que votre serveur ne prend pas en charge.

J'ai utilisé un plugin appelé MetaWhere pour augmenter la syntaxe d'ARel, rendant les chaînes moins nécessaires.

Questions connexes