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.