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
!nil
se evalúa comotrue
en Ruby, y Arel se traducetrue
a1
una 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.not
para que pueda hacer esto:Cuando trabajo con ámbitos entre tablas, prefiero aprovechar
merge
para poder usar los ámbitos existentes con mayor facilidad.Además, dado
includes
que no siempre elige una estrategia de unión, también debe usarlareferences
aquí, de lo contrario puede terminar con SQL no válido.fuente
rails undefined method 'not_eq' for :confirmed_at:Symbol
..where
condiciones de encadenamiento de @BKSpurgeon son simplemente construir un AST, no golpea la base de datos hasta que golpeas un método terminal comoeach
oto_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 => true
te meteid = 1
en 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
references
llamada 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