2008-11-13 29 views
5

Supongamos que tengo un modelo llamado "producto". Supongamos que el producto tiene tres campos. Estos campos son 'nombre' (tipo cadena), 'costo' (tipo entero) e 'is_visible' (escriba bool).¿Cómo puedo usar el método Rails "find" para realizar una consulta AND o una OR?

1) ¿Cómo puedo hacer una consulta de búsqueda utilizando el método "find" de Rails (si hay otro método, está bien) para poder buscar todos los productos con un costo superior a 100 Y is_visible es cierto?

2) ¿Qué pasa si queremos cambiar esto para buscar el nombre! = '' O costo == 0?

Esto no es un problema para hacer un SQL, pero me gustaría pensar que Rails tiene una manera de hacer Y/O consultas a la base de datos sin usar SQL.

Gracias!

Respuesta

13

Debería usar la opción de condiciones en el método de búsqueda. La opción de condiciones puede ser Hash, Array o String. Hay muchas opciones para las condiciones, por lo que recomiendo leer el API help. Por ejemplo si quieres (1):

Product.find(:all, :conditions => ['cost > ? and is_visible is true', 100]) 

O (2)

Product.find(:all, :conditions => ["name != '' or cost =0]) 
+2

No creo que "es verdad" es una sintaxis correcta de SQL92 ... –

+0

De acuerdo con rails api doc debería ser 'verdadero =' pero Adam parece haber perdido el punto en sus respuestas y aquí es una Los raíles no cuestionan una pregunta de SQL. Para muchos de nosotros, el camino de Rails es más fácil y mejor. – allesklar

+2

En realidad, todo lo que incluyas en: las condiciones se incorporarán directamente en la instrucción SELECT generada por ActiveRecord, por lo que definitivamente tiene algo que ver con SQL. –

0

Este es exactamente el problema de SQL fue diseñado para resolver, así que por qué no usarlo? Simplemente agregue una condición apropiada y su problema se resuelva.

+0

Porque LINQ me ha echado a perder. –

+0

Ya veo, así que elaboré esto en mi segunda respuesta, espero que ayude. –

+0

El hecho de que esto se haya votado negativamente solo me convence del sorprendente hecho de que la mayoría de los desarrolladores de Rails tienen miedo de SQL. Esto es interesante, ya que SQL es un gran ejemplo de una DSL externa, y la gente de Rails generalmente les gusta las DSL. –

4

Si desea algo como LINQ, puede verificar ORM Ruby alternativos como DataMapper o Sequel que proporcionan capacidades de filtrado más complejas.

Por ejemplo en Sequel 2 se puede escribir:

items.filter((:cost > 100) & (:is_visible = 1)) 

También puede utilizar el bit a bit "|" operador para obtener la condición de O

En este DataMapper será parecida:

Model.all(:cost.gt => 100, :is_visible.eq => 1) 

Sin embargo, algunas personas no les gusta el hecho de que esas características se implementan por la sobrecarga de la clase de símbolos estándar.

Cuestiones relacionadas