#14 Performing Calculations on Models
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 })
=> 2SELECT 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})
=> 10Esto 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)


