2009-01-01 11 views
5

Soy bastante nuevo en Rails y tenía curiosidad acerca de algunas de las convenciones que los expertos están usando cuando necesitan construir una consulta SQL muy compleja que contiene muchas condiciones. Específicamente, manteniendo el código legible y mantenible.¿Cuál es su convención para especificar consultas SQL complejas en Rails?

Hay un par de maneras que se me ocurren:

sola línea, en la llamada de encontrar():

@pitchers = Pitcher.find(:all, "<conditions>") 

utilizar una cadena predefinida y pasarlo en:

@pitchers = Pitcher.find(:all, @conditions) 

utilizar una función miembro privado para devolver una consulta

@pitchers = Pitcher.find(:all, conditionfunction) 

Me inclino por la convención de función de miembro privado, adicionalmente porque podría pasar parámetros para personalizar la consulta.

¿Alguna idea de esto?

Respuesta

7

Casi nunca paso las condiciones al find. Usualmente esas condiciones serían valiosas para agregar a su modelo de objeto en forma de un named_scope o incluso solo como un método de clase en el modelo. Los ámbitos con nombre son agradables porque puedes encadenarlos, lo que le quita un poco la complejidad. También le permiten pasar parámetros también.

Además, casi nunca debería simplemente pasar una cadena de condición SQL sin formato. Debe utilizar el estilo hash (:conditions => { :name => 'Pat' }) o el estilo de matriz (['name = ?', 'Pat']). De esta forma, el SQL se escapa para usted, ofreciendo cierta protección contra los ataques de inyección SQL.

Por último, creo que el enfoque que está considerando, en el que intenta crear condiciones en cualquier contexto al que llama find es un enfoque erróneo. El trabajo del modelo es proporcionar una interfaz a través de la cual se devuelve la respuesta pertinente. Tratando de determinar las condiciones para pasar a una llamada find es demasiado cerca de la implementación subyacente si me preguntas. Además, es más difícil de probar.

+0

Excelentes comentarios, ¡gracias! – unknownuser

+0

Me alegra ayudar. Déjame preguntarte esto: ¿en qué contexto llamas 'encontrar'? ¿Controlador? Otro modelo? Espero no ver :) – nakajima

+0

Desde el controlador. He estado haciendo la mayoría de mis hallazgos de esa manera. Veré cómo los empuja hacia el modelo. – unknownuser

Cuestiones relacionadas