Supponiamo di avere un modello Page che ha il solo attributo content che memorizza il sorgente HTML di una certa pagina Web, e di voler mettere in relazione ogni istanza del modello Bookmark con una istanza di questo modello così da poter abbinare a ciascun bookmark il contenuto della relativa pagina.
Per specificare la relazione uno a uno fra il modello Bookmark e il modello Page procediamo prima a creare una nuova colonna dal nome bookmark_id nella tabella pages con una migrazione dedicata, e quindi modifichiamo i modelli come segue:
class Bookmark < ActiveRecord::Base has_one :page # validazioni #... end class Page < ActiveRecord::Base belongs_to :bookmarks # validazioni #... end
has_one e belongs_to rivestono in questo caso un ruolo molto simile, poiché entrambe le istruzioni specificano una relazione uno a uno fra il modello di partenza e quello referenziato. Prendiamo come regola che belongs_to deve essere posto nel modello che contiene la chiave esterna, e in questo caso Page.
Le variabili @bookmark e @page contenengono rispettivamente un'istanza del modello Bookmark ed una del modello Page, possiamo utilizzare quindi le operazioni:
| Operazione | Descrizione |
|---|---|
@bookmark.page = @page |
per mettere in relaziona uno a uno le due istanze |
@bookmark.page = nil |
per annullare la relazione |
@bookmark.page.nil? |
restituisce true se non è presente alcuna relazione, false altrimenti |
Le opzioni per le relazioni uno a uno sono del tutto simili a quelle descritte in precedenza per la relazione uno a molti; di fatto la relazione uno a uno si comporta in modo molto simile alla relazione molti a molti a meno della cardinalità dell'associazione.
Se vuoi aggiornamenti su Development inserisci la tua email nel box qui sotto: