¿Cómo puedo encontrar registros en mi base de datos en condiciones no iguales? Tengo esto ahora, pero ¿hay una forma elegante de hablar con rieles?
GroupUser.where('user_id != ?',me)
¿Cómo puedo encontrar registros en mi base de datos en condiciones no iguales? Tengo esto ahora, pero ¿hay una forma elegante de hablar con rieles?
GroupUser.where('user_id != ?',me)
Respuestas:
En Rails 4.x (Ver http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions )
En Rails 3.x
Para acortar la longitud, puede almacenar
GroupUser.arel_table
en una variable o, si se usa dentro del modeloGroupUser
, por ejemplo, en ascope
, puede usar enarel_table[:user_id]
lugar deGroupUser.arel_table[:user_id]
Rails 4.0 crédito de sintaxis a la respuesta de @ jbearden
fuente
GroupUser.where(other_condition: true).where.not(user_id: user_id)
Carriles 4
fuente
La única forma de hacerlo más elegante es con MetaWhere .
MetaWhere tiene un primo más nuevo que se llama Squeel que permite un código como este:
No hace falta decir que si este es el único refactor que vas a hacer, no vale la pena usar una gema y me quedaría con lo que tienes. Squeel es útil en situaciones en las que tiene muchas consultas complejas que interactúan con el código Ruby.
fuente
Carriles 4:
Si desea usar ambos no iguales e iguales, puede usar:
Si desea utilizar una variedad de operadores (es decir
>
,<
), en algún momento puede cambiar las anotaciones a las siguientes:fuente
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
?Usted debe siempre incluir el nombre de la tabla en la consulta SQL cuando se trata de asociaciones.
De hecho, si otra tabla tiene la
user_id
columna y une ambas tablas, tendrá un nombre de columna ambiguo en la consulta SQL (es decir, problemas).Entonces, en tu ejemplo:
O un poco más detallado:
Tenga en cuenta que si está utilizando un hash, no necesita preocuparse por eso porque Rails se encarga de usted:
En Rails 4, como dijo @ dr4k3,
not
se ha agregado el método de consulta :fuente
En Rails 3, no sé nada más elegante. Sin embargo, no estoy seguro si sabe, su condición no igual no coincide con los valores NULL (user_id). Si quieres eso, tendrás que hacer algo como esto:
fuente