2011-05-14 30 views
22

Quiero tener una cláusula where con un igual y no es igual condición:No es igual condicional

@user = User.where(:user_id => current_user.id, :author_id != current_user.id).nil? ? (render :something) : (render :somethingelse) 

Lo anterior no funciona: error de sintaxis

, inesperada ')', esperando tASSOC ... d,: user_id! = current_user.id) .nil? ? (Render : índice): (re ...

Si cambio la segunda condición de != a => que va a funcionar, sin embargo

¿Cómo puedo tener ambas condiciones en una clase donde Gracias.? que

+1

@taro Completé "Tutorial de Ruby on Rails: Aprende los rieles con el ejemplo" esta semana, pero no cubría ese tipo de condicionales, así que todavía estoy aprendiendo. También sugirió que comenzara con Rails antes de pasar a Ruby. Pero gracias por tus comentarios. – user715697

+0

debe usar 'empty?' En lugar de 'nil?' Porque 'where' devuelve una matriz, per se. – konyak

Respuesta

23

Así es como se usaría Arel para generar la consulta "select * from users where user_id = ? and author_id != ?":

users = User.arel_table 
User.where(users[:user_id].  eq(current_user.id).and(
      users[:author_id].not_eq(current_user.id))) 

Usar Arel no es tan conciso como usar condiciones Hash para condiciones simples, ¡pero es mucho más poderoso!

Aquí hay un enlace a la full list of predications (eq, not_eq, gt, lt, etc.) disponible con Arel.

+2

Esta respuesta es mejor porque es más agnóstico de la base de datos. Por ejemplo, algunas bases de datos no entienden '! =' Pero otras lo harán. – maletor

+0

+1 para Arel, hace que el dolor de ActiveRecord desaparezca – ryan0

7

El error de sintaxis se debe a que el intento de usar != en lugar de =>. El método where no admite la desigualdad con argumentos hash, por lo que su no igual tendrá que ser escrito usando argumentos de matriz.

User.where(:user_id => current_user.id).where(['users.author_id <> ?', current_user.id]) 
+0

Gracias Douglas.¿Hay alguna forma de usar: author_id en lugar de tenerlo como un literal entre comillas? (No es que importe, solo curiosidad) – user715697

+1

La única sugerencia que podría agregar a esto sería mirar meta_where, que en realidad admite una sintaxis muy similar a la que publicó en su pregunta. https://github.com/ernie/meta_where –

+0

+1 para meta_where – aceofspades

21

creo, debería ser: son posibles

@user = User.where(['user_id = ? AND author_id <> ?', current_user.id, current_user.id]) 
render(@user ? :something : :somethingelse) 
+0

Gracias también funcionó. ¿Adivino que no puedo obtener todo en una línea usando .nil? como esperaba, sin embargo :) – user715697

17

Carriles 4 ha dado cuenta de todo esto

Model.where.not(:colname => nil) 
#=> returns all records whose :colname values are not nil 
0

No estoy seguro si usted es consciente, la condición no es igual por lo general no coincide (autor_id) valores NULL. Tendrás que hacer un OR author_id IS NULL si quieres eso.

@users = User.where("user_id = ? AND (author_id != ? OR author_id IS NULL)", 
        current_user.id, current_user.id) 

render(@users.present? ? :something : :somethingelse) 

También tenga en cuenta que estoy usando @users.present? porque where buscador devuelve una matriz ActiveRecord::Relation.