- find by id – passando al metodo come parametri uno o più interi (ovviamente nel caso di più id, il metodo ritornerà un array di modelli) – nel caso di record non trovato, il metodo
lancieràlancerà un eccezione RecordNotFound - find first – passando al metodo il simbolo :first ed eventualmente altre opzioni secondarie – in caso negativo tornerà nil
- find all – passando al metodo il simbolo :all ed eventualmente altre opzioni secondarie – in caso negativo tornerà un array vuoto
Vediamo subito qualche esempio:
team = Team.find(1) #team conterrà l'oggetto Team con id uguale a 1 teams = Team.find([1,2,3]) #teams sarà un array di Team team = Team.find(:first) #prima squadra per id teams = Team.find(:all) #array contenente tutte le squadre
Ovviamente il metodo presenta altre molte modalità di utilizzo, rappresentabili tramite un hash associativo. Tra le principali vale la pena di ricordare:
- :conditions – permette di impostare delle condizioni alla query di ricerca (rappresenta il where nelle sintassi sql)
- :order – permette di impostare l’ordine dei record
- :limit – permette di limitare il numero di record ritornati
teams = Team.find(:all, :conditions => "balance > 1000", :order => "name") team = Team.find(:first, :order => "balance") teams = Team.find(:all, :order => "name", :limit => 10)
Oltre al metodo find esistono i cosiddetti dynamic finder, metodi creati ad hoc per recuperare i nostri modelli a partire da un attributo chiave. Questi metodi presentano una struttura comune: find_by_(attr) e find_all_by_(attr). Basterà sostituire (attr) con un attributo della classe per avere dei metodi pronti all’uso. La prima categoria di finders ritorneranno il primo record mentre la seconda un array. Guardiamo un esempio:
milan = Team.find_by_name("Milan") inter = Team.find_by_owner("Massimo Moratti") richest = Team.find_all_by_balance(1000000)
I dinamic finder possono essere mixati tra di loro creando di fatti nuovi metodi:
juve = Team.find_by_name_and_owner("Juventus", "Giovanni Cobolli Gigli") romane = Team.find_all_by_name_or_owner("Lazio", "Franco Sensi")
Nel caso di congiunzione and entrambi i requisiti devono essere rispettati; nel caso or basta che ne venga rispettato solamente uno.
Gli ultimi due metodi da segnalare sono count(API) e exists?(API) che permettono rispettivamente di conteggiare i record che rispecchiano determinati requisiti (parametri simili al metodo find) e di sapere se un preciso modello esiste già nel database.
c = Team.count("balance > 1000") #torna un intero b = Team.exists?(:name => "Milan") #torna un boolean