Respuestas:
En Rails 4.x (Ver http://edgeguides.rubyonrails.org/active_record_querying.html#not-conditions )
GroupUser.where.not(user_id: me)
En Rails 3.x
GroupUser.where(GroupUser.arel_table[:user_id].not_eq(me))
Para acortar la longitud, puede almacenar GroupUser.arel_table
en una variable o, si se usa dentro del modelo GroupUser
, por ejemplo, en a scope
, puede usar en arel_table[:user_id]
lugar deGroupUser.arel_table[:user_id]
Rails 4.0 crédito de sintaxis a la respuesta de @ jbearden
GroupUser.where(other_condition: true).where.not(user_id: user_id)
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:
GroupUser.where{user_id != me}
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.
Carriles 4:
Si desea usar ambos no iguales e iguales, puede usar:
user_id = 4
group_id = 27
GroupUser.where(group_id: group_id).where.not(user_id: user_id)
Si desea utilizar una variedad de operadores (es decir >
, <
), en algún momento puede cambiar las anotaciones a las siguientes:
GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)
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:
GroupUser.where("groups_users.user_id != ?", me)
O un poco más detallado:
GroupUser.where("#{table_name}.user_id IS NOT ?", me)
Tenga en cuenta que si está utilizando un hash, no necesita preocuparse por eso porque Rails se encarga de usted:
GroupUser.where(user: me)
En Rails 4, como dijo @ dr4k3, not
se ha agregado el método de consulta :
GroupUser.where.not(user: me)