2011-01-07 8 views
14

Acabo de empezar a utilizar el método .where, y estoy un poco confundido acerca de cómo utilizarlo por completo.Usando el método .where en Rails3

me gustaría hacer algo como:

@books = Book.where(:author_id => 1 || 2) 

claramente sé que no funciona, pero estoy tratando de demostrar que yo quiero algo de lógica adicional aquí. algunos "o" "y" "no son iguales", etc.

¿Alguna idea de dónde puedo investigar esto? Estaba buscando API en los rieles, pero no vi nada que fuera tan útil.

Gracias!

Respuesta

26

1 || 2 no funcionará debido a que la expresión se evalúa antes de la llamada de función (que evalúa a 1, por lo que debería ser equivalente a Book.where(:author_id => 1) lo haría:..

@books = Book.where(:author_id => [1, 2]) 

El SQL generado sería WHERE author_id IN (1, 2)

+0

Cam, que funcionaba muy bien, gracias! ¿Alguna idea de cómo puedo usar dónde o un método diferente para lograr la lógica de tipo "y" o "no es igual"? – Elliot

+0

Hey Elliot, lamentablemente, el argumento hash para 'where' no admite consultas de tipo 'no es igual' (consulte http://guides.rubyonrails.org/active_record_querying.html" Solo es posible la igualdad, el rango y la verificación de subconjuntos con Condiciones de hash "). En cuanto a las consultas "y", simplemente agregue otra clave a su hash así que: 'Book.where (: author_id => [1, 2],: bestseller => true)' se compilaría en 'WHERE author_id IN (1, 2) Y el best seller ES VERDADERO) ' – cam

+0

¿cómo se debe modificar para mongoid –

3

En cuanto a la fuente (! No hay documentación decente), puede pasar a través de SQL, que se puede parametrizar como el SQL para: condiciones, etc., por lo que puede hacer algo como:

@books = Book.where("author_id = 1 OR author_id = 2") 
No

ideal para desplegar SQL en bruto, pero no puedo ver una manera más elegante de hacerlo usando el método where.

Source and absence of documentation here

+0

lo haría '@books = Book.where ("author_id = O author_id =?", 1, 2)' Hey – DemitryT

1

Parece que es posible que desee ver Arel para cosas más complejas. Ya está integrado en Rails 3 (AR lo usa internamente).

book = Book.arel_table 
# range 
Book.where(book[:author_id].gt(0).and(book[:author_id].lt(3)) 

#or 
Book.where(b[:author_id].eq(0).or(t[:author_id].eq(3).order(:first_name)) 

#joins 
book.join(authors).on(book[:author_id].eq(author[:id])). 
    where(book[:title].matches 'hokum n stuff') 

También agrupar por, agregación y mucho más. El inconveniente es que la documentación es escasa. docs

tests

Cuestiones relacionadas