#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 }) => 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)