ActiveRecord fornisce svariati metodi per eseguire calcoli sui modelli (note anche come funzioni di aggregazione, in SQL). Per dimostrare questo, useremo un modello Task
cha ha un campo intero chiamato priority
e guardiamo alcuni di questi metodi in una script/console
. Per ogni metodo, l’SQL generato da Rails è mostrato subito dopo.
Possiamo recuperare al priority del primo task così:
>> Task.first.priority
=> 3
SELECT * FROM "tasks" LIMIT 1
E se volessimo la somma delle priority di tutti i task?
>> Task.sum(:priority)
=> 12
SELECT sum("tasks".priority) AS sum_priority FROM "tasks"
Possiamo persino passare delle condizioni:
>> Task.sum(:priority, :conditions => {:completed => false })
=> 2
SELECT sum("tasks".priority) AS sum_priority FROM "tasks" WHERE (completed="f")
Così come il metodo sum
, ce ne sono altri, come minimum
, maximum
e average
:
>> 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"
L’SQL generato da Rails quando si usano questi metodi è usato per rendere più efficiente il calcolo rispetto all’equivalente eseguito tramite oggetti Ruby.
Utilizzo dei metodi sulle associazioni.
Trattandosi di metodi di classe, possono essere usati anche attraverso le associazioni. Se abbiamo un modello di Project
, che has_many :tasks
, possiamo accedere a questi metodi per i task di uno specifico progetto. Si noti che, come prima, possiamo passare condizioni alla find
.
>> project = Project.first
=> #<Project id: 1, title: "A Project">
>> project.tasks.sum(:priority, :conditions => {:completed => true})
=> 10
Questo esegue il codice SQL riportato qui sotto:
SELECT sum("tasks".priority) AS sum_priority FROM "tasks" WHERE ("tasks"."completed" = 't') AND ("tasks".project_id = 1)