Usando el estilo de los rieles 3, ¿cómo escribiría lo contrario de:
Foo.includes(:bar).where(:bars=>{:id=>nil})
Quiero encontrar dónde la identificación NO es nula. Lo intenté:
Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql
Pero eso vuelve:
=> "SELECT \"foos\".* FROM \"foos\" WHERE (\"bars\".\"id\" = 1)"
Eso definitivamente no es lo que necesito, y casi parece un error en ARel.
ruby-on-rails
rails-activerecord
arel
SooDesuNe
fuente
fuente

!nilse evalúa comotrueen Ruby, y Arel se traducetruea1una consulta SQL. Entonces, la consulta generada es, de hecho, lo que solicitó, esto no fue un error de ARel.Respuestas:
La forma canónica de hacer esto con Rails 3:
ActiveRecord 4.0 y superior agrega
where.notpara que pueda hacer esto:Cuando trabajo con ámbitos entre tablas, prefiero aprovechar
mergepara poder usar los ámbitos existentes con mayor facilidad.Además, dado
includesque no siempre elige una estrategia de unión, también debe usarlareferencesaquí, de lo contrario puede terminar con SQL no válido.fuente
rails undefined method 'not_eq' for :confirmed_at:Symbol..wherecondiciones de encadenamiento de @BKSpurgeon son simplemente construir un AST, no golpea la base de datos hasta que golpeas un método terminal comoeachoto_a. Crear la consulta no es una preocupación de rendimiento; lo que está solicitando de la base de datos es.No es un error en ARel, es un error en su lógica.
Lo que quieres aquí es:
fuente
true, que es un booleano.:id => truete meteid = 1en SQLese.field_name != 'NULL'.id = 't':)Para Rails4:
Entonces, lo que quieres es una combinación interna, por lo que realmente deberías usar el predicado de combinaciones:
Pero, para el registro, si desea una condición "NOT NULL" simplemente use el predicado not:
Tenga en cuenta que esta sintaxis informa una desuso (habla de un fragmento de cadena SQL, pero supongo que la condición de hash se cambia a cadena en el analizador), así que asegúrese de agregar las referencias al final:
fuente
referencesllamada me ayudó!No estoy seguro de que esto sea útil, pero esto es lo que funcionó para mí en Rails 4
fuente
Con Rails 4 es fácil:
Ver también: http://guides.rubyonrails.org/active_record_querying.html#not-conditions
fuente