homeASCIIcasts

14: Realizando operaciones en modelos 

(view original Railscast)

Other translations: En It Fr

Other formats:

Written by Aldo Escudero (aldoescudero.com.ar)

ActiveRecord provee muchos métodos diferentes para realizar operaciones en modelos. Para demostrarlo, vamos a utilizar un modelo Tareas (Task) que tiene un campo entero llamado prioridad (priority) y veremos alguno de esos métodos en script/console. Para cada método, el SQL generado por Rails es mostrado debajo.

Podemos encontrar la prioridad de la primera tarea de la siguiente forma:

>> Task.first.priority 
=> 3 
SELECT * FROM "tasks" LIMIT 1  

Pero si queremos sumar las prioridades de todas las tareas?

>> Task.sum(:priority) 
=> 12 
SELECT sum("tasks".priority) AS sum_priority FROM "tasks"  

También podemos pasar condiciones:

>> Task.sum(:priority, :conditions => {:completed => false }) 
=> 2 
SELECT sum("tasks".priority) AS sum_priority FROM "tasks" WHERE (completed="f")  

Así como también hay otros métodos, tales como minimum (mínimo), maximum (máximo) y average (promedio):

>> Task.minimum(:priority) 
=> 2 
SELECT min("tasks".priority) AS min_priority FROM "tasks"  
>> Task.maximum(:priority) 
=> 5 
SELECT max("tasks".priority) AS max_priority FROM "tasks"  
>> Task.average(:priority).to_f 
=> 3.0 
SELECT avg("tasks".priority) AS avg_priority FROM "tasks"  

El código SQL generado por Rails cuando estos métodos son utilizados los hace más eficientes que calcular estos valores utilizando Ruby para devolver todas las Tareas y calcular los valores.

Uso de métodos a través de asociaciones.

Estos métodos son métodos de clase así que también pueden utilizarse a través de asociaciones. Si tenemos un modelo Proyecto (Project), que tiene muchas tareas (has_many :tasks), podemos acceder estos métodos para las tareas en un proyecto específico. Observe que, como antes, podemos pasar condiciones al find (búsqueda).

>> project = Project.first 
=> #<Project id: 1, title: "A Project"> 
>> project.tasks.sum(:priority, :conditions => {:completed => true}) 
=> 10 

Esto ejecuta el código SQL de abajo

SELECT sum("tasks".priority) AS sum_priority FROM "tasks" WHERE ("tasks"."completed" = 't') AND ("tasks".project_id = 1)