387 votes

Rails 3 condition where à l’aide de NOT NULL

En utilisant le style de rails 3 Comment J’écrirais le contraire de :

Je veux trouver où id n’est pas null. J'ai essayé :

Mais qui retourne :

C’est certainement pas ce que j’ai besoin et semble presque comme un bogue dans ARel.

547voto

Adam Lassek Points 18918

La manière canonique pour ce faire avec des Rails 3.2 et ci-dessous:

Foo.includes(:bar).where("bars.id IS NOT NULL")

Je recommande une bibliothèque appelée Squeel. C'est mieux que d'utiliser des chaînes partout, et beaucoup plus facile à utiliser qu'en ligne droite ARel:

Foo.includes(:bar).where{ bars.id != nil }

ActiveRecord 4.0 et ci-dessus ajoute where.not de sorte que vous pouvez le faire:

Foo.includes(:bar).where.not('bars.id' => nil)

253voto

Ryan Bigg Points 64561

Il n’est pas un bug dans ARel, il s’agit d’un bug dans votre logique.

Ce que vous voulez ici est :

38voto

Matt Rogish Points 11824

Pour Rails4:

Donc, ce que vous êtes désireux est une jointure interne, de sorte que vous devriez vraiment juste utiliser les jointures de prédicat:

  Foo.joins(:bar)

  Select * from Foo Inner Join Bars ...

Mais, pour l'enregistrement, si vous voulez un "not NULL" condition simplement utiliser le pas de prédicat:

Foo.includes(:bar).where.not(bars: {id: nil})

Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL

Notez que cette syntaxe rapports d'une dépréciation (il parle d'une chaîne de code SQL, mais je suppose que la condition hachage est modifié à la chaîne dans l'analyseur?), donc, assurez-vous d'ajouter les références à la fin:

Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)

La DÉPRÉCIATION AVERTISSEMENT: On dirait que vous êtes désireux de chargement table(s) (un de: ....) qui sont référencées dans une chaîne de code SQL. Par exemple:

Post.includes(:comments).where("comments.title = 'foo'")

Actuellement, Active Record reconnaît la table dans la chaîne, et qui sait pour REJOINDRE les commentaires de la table de la requête, plutôt que de charger les commentaires dans une requête distincte. Cependant, cela sans écrire une pleine soufflé Analyseur SQL est par nature imparfait. Puisque nous ne voulons pas écrire de SQL analyseur, nous sommes à la suppression de cette fonctionnalité. À partir de maintenant, vous devez indiquer explicitement d'Enregistrement Active lorsque vous faites référence à une table à partir d'une chaîne de caractères:

Post.includes(:comments).where("comments.title = 'foo'").references(:comments)

23voto

Tilo Points 13833

Avec 4 Rails, c’est facile :

Voir aussi : http://guides.rubyonrails.org/active_record_querying.html#not-conditions

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X