…per limitare il numero di query durante l’esecuzione del comando each è possibile da prima filtrare i risultati, operando solamente sui dati che realmente servono?
clients = Client.limit(
10
)
clients.
each
do
|client|
puts client.address.postcode
end
il pezzo di code soprar riportasto può essere riscritto così:
clients = Client.includes(
:address
).limit(
10
)
clients.
each
do
|client|
puts client.address.postcode
end
Questo perchè include ottimizza la query basandosi sui legami di appartenenza delle classi conivolte.
Grazie ad Active Record, è possibile recuperare questi dati dal db, semplicemente utilizzando la semantica che si può ricondurre al linguaggio SQL:
- where
- select
- group
- order
- reorder
- reverse_order
- limit
- offset
- joins
- includes
- lock
- readonly
- from
- having
Una cosa che ritengo davvero importante ed elegante e come gli sviluppatori siano riuciti a implementre queste query sql in rails, per esempio:
Client.where(
"orders_count = ?"
, params[
:o rders
])
stando bene attenti agli SQL Injections.
Ultima cosa interessante sono gli scope ovvero un modo utile e in pieno stile rails, cioè riusabile e super maneggevole, per creare della query. Il vantaggio? ogni volta che si richiamerà la funzione, non verrà eseguita la query fintantoché non verrà completata da un .all, .count, .each o .first, come riportato nell’esempio finale di questo sito.
Ulteriori approfondimenti e idee per migliorare il vostro stile di programmazione li trovate in Rails Guides oppure nel Railscast 202