En utilisant le style des rails 3, comment pourrais-je écrire le contraire de:
Foo.includes(:bar).where(:bars=>{:id=>nil})
Je veux trouver où id n'est PAS nul. J'ai essayé:
Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql
Mais cela revient:
=> "SELECT \"foos\".* FROM \"foos\" WHERE (\"bars\".\"id\" = 1)"
Ce n'est certainement pas ce dont j'ai besoin, et cela ressemble presque à un bug dans ARel.
ruby-on-rails
rails-activerecord
arel
SooDesuNe
la source
la source
!nil
est évaluétrue
dans Ruby et ARel se traduittrue
par1
dans une requête SQL. Donc, la requête générée est en fait ce que vous avez demandé - ce n'était pas un bug ARel.Réponses:
La manière canonique de le faire avec Rails 3:
ActiveRecord 4.0 et versions ultérieures
where.not
vous permettent de le faire:Lorsque je travaille avec des étendues entre des tables, je préfère tirer parti
merge
afin de pouvoir utiliser plus facilement les étendues existantes.De plus, comme
includes
ne choisit pas toujours une stratégie de jointure, vous devez également l'utiliserreferences
ici, sinon vous risquez de vous retrouver avec un SQL non valide.la source
rails undefined method 'not_eq' for :confirmed_at:Symbol
..where
conditions de chaînage consistent simplement à créer un AST, il ne frappe pas la base de données jusqu'à ce que vous frappiez une méthode de terminal commeeach
outo_a
. La création de la requête n'est pas un problème de performances; ce que vous demandez à la base de données.Ce n'est pas un bug dans ARel, c'est un bug dans votre logique.
Ce que vous voulez ici, c'est:
la source
true
, ce qui est un booléen.:id => true
vous obtientid = 1
en SQLese.field_name != 'NULL'
.id = 't'
:)Pour Rails4:
Donc, ce que vous voulez, c'est une jointure interne, vous devez donc simplement utiliser le prédicat des jointures:
Mais, pour mémoire, si vous voulez une condition "NOT NULL", utilisez simplement le non prédicat:
Notez que cette syntaxe signale une dépréciation (elle parle d'un extrait de chaîne SQL, mais je suppose que la condition de hachage est changée en chaîne dans l'analyseur?), Alors assurez-vous d'ajouter les références à la fin:
la source
references
appel m'a aidé!Je ne sais pas si cela est utile, mais c'est ce qui a fonctionné pour moi dans Rails 4
la source
Avec Rails 4, c'est simple:
Voir aussi: http://guides.rubyonrails.org/active_record_querying.html#not-conditions
la source