steps rails new mvc guide generate first create blog ruby-on-rails ruby-on-rails-3

ruby on rails - new - Modelo Rails encuentra donde no es igual



rails guide (7)

¿Cómo puedo encontrar registros en mi base de datos en una condición no igual? Tengo esto ahora, pero ¿hay una forma elegante de hablar sobre los rieles?

GroupUser.where(''user_id != ?'',me)


Carriles 4

GroupUser.where.not(user_id: me)


En Rails 3, no sé nada más elegante. Sin embargo, no estoy seguro si usted sabe, su condición no igual no coincide con los valores NULL (user_id). Si quieres eso, tendrás que hacer algo como esto:

GroupUser.where("user_id != ? OR user_id IS NULL", me)


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 duración, puede almacenar GroupUser.arel_table en una variable o si se usa dentro del modelo GroupUser , por ejemplo, en un scope , puede usar arel_table[:user_id] lugar de GroupUser.arel_table[:user_id]

Crédito de sintaxis de Rails 4.0 a la respuesta de @ jbearden


La única manera 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 yo simplemente me quedaré con lo que tienes. Squeel es útil en situaciones donde tienes muchas consultas complejas que interactúan con el código de Ruby.


Lo que tienes es una buena manera de hacerlo, creo.


Rails 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 querer cambiar las anotaciones a lo siguiente:

GroupUser.where("group_id > ? AND user_id != ?", group_id, user_id)


Siempre debe incluir el nombre de la tabla en la consulta SQL al tratar con asociaciones.

De hecho, si otra tabla tiene la columna user_id 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 porque Rails se ocupa de ello:

GroupUser.where(user: me)

En Rails 4, como dice @ dr4k3, el método de consulta not se ha agregado:

GroupUser.where.not(user: me)