Risposte:
Sostanzialmente fanno la stessa cosa, l'unica differenza è da che parte della relazione sei. Se a Userha una Profile, allora nella Userclasse che avresti has_one :profilee nella Profileclasse che avresti belongs_to :user. Per determinare chi "ha" l'altro oggetto, guarda dove si trova la chiave esterna. Possiamo dire che un User"ha" un Profileperché la profilestabella ha una user_idcolonna. Se ci fosse una colonna chiamata profile_idsulla userstabella, tuttavia, diremmo che a Profileha a User, e le posizioni appartiene_to / has_one verrebbero scambiate.
ecco una spiegazione più dettagliata.
Product belongs_to Shopsignifica che la productstabella ha una shop_idcolonna
Riguarda dove si trova la chiave esterna.
class Foo < AR:Base
end
belongs_to :bar, la tabella foos ha una bar_idcolonnahas_one :bar, la tabella delle barre ha una foo_idcolonnaA livello concettuale, se il tuo class Aha una has_onerelazione con class Ballora class Aè il genitore class Bquindi la tua class Bvolontà avrà una belongs_torelazione class Adal momento che è la figlia di class A.
Entrambi esprimono una relazione 1-1. La differenza è soprattutto dove posizionare la chiave esterna, che va sul tavolo per la classe che dichiara la belongs_torelazione.
class User < ActiveRecord::Base
# I reference an account.
belongs_to :account
end
class Account < ActiveRecord::Base
# One user references me.
has_one :user
end
Le tabelle per queste classi potrebbero assomigliare a:
CREATE TABLE users (
id int(11) NOT NULL auto_increment,
account_id int(11) default NULL,
name varchar default NULL,
PRIMARY KEY (id)
)
CREATE TABLE accounts (
id int(11) NOT NULL auto_increment,
name varchar default NULL,
PRIMARY KEY (id)
)
Accounte Userin questo esempio è sfortunato in quanto spesso un account può avere molti utenti.
has_onee belongs_togeneralmente sono uguali nel senso che indicano l'altro modello correlato. belongs_toassicurarsi che questo modello abbia foreign_keydefinito.
has_onesi assicura che sia has_foreigndefinita l'altra chiave del modello .
Per essere più specifici, ci sono due lati di relationship, uno è l' Owneraltro e l'altro è Belongings. Se has_oneviene definito solo possiamo ottenere il suo Belongingsma non possiamo ottenere Ownerdal belongings. Per rintracciare Ownerè necessario definire belongs_toanche il modello di appartenenza.
Un'altra cosa che voglio aggiungere è, supponiamo di avere la seguente associazione di modelli
class Author < ApplicationRecord
has_many :books
end
se scriviamo solo l'associazione di cui sopra, possiamo ottenere tutti i libri di un determinato autore di,
@books = @author.books
Ma per un libro particolare non possiamo ottenere l'autore corrispondente di,
@author = @book.author
per far funzionare il codice sopra riportato è necessario aggiungere anche un'associazione al modello Book, in questo modo
class Book < ApplicationRecord
belongs_to :author
end
Ciò aggiungerà il metodo "autore" al modello del libro.
Per i dettagli sulla modalità, consultare le guide
Dal punto di vista della semplicità, belongs_toè meglio che has_oneperché has_one, dovresti aggiungere i seguenti vincoli al modello e alla tabella che ha la chiave esterna per imporre la has_onerelazione:
validates :foreign_key, presence: true, uniqueness: true