Archivi tag: AvticeRecord

Rails 3, lo sapevi che…

…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.eachdo|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