Risposte:
Sostanzialmente fanno la stessa cosa, l'unica differenza è da che parte della relazione sei. Se a User
ha una Profile
, allora nella User
classe che avresti has_one :profile
e nella Profile
classe 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 Profile
perché la profiles
tabella ha una user_id
colonna. Se ci fosse una colonna chiamata profile_id
sulla users
tabella, tuttavia, diremmo che a Profile
ha a User
, e le posizioni appartiene_to / has_one verrebbero scambiate.
ecco una spiegazione più dettagliata.
Product belongs_to Shop
significa che la products
tabella ha una shop_id
colonna
Riguarda dove si trova la chiave esterna.
class Foo < AR:Base
end
belongs_to :bar
, la tabella foos ha una bar_id
colonnahas_one :bar
, la tabella delle barre ha una foo_id
colonnaA livello concettuale, se il tuo class A
ha una has_one
relazione con class B
allora class A
è il genitore class B
quindi la tua class B
volontà avrà una belongs_to
relazione class A
dal 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_to
relazione.
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)
)
Account
e User
in questo esempio è sfortunato in quanto spesso un account può avere molti utenti.
has_one
e belongs_to
generalmente sono uguali nel senso che indicano l'altro modello correlato. belongs_to
assicurarsi che questo modello abbia foreign_key
definito.
has_one
si assicura che sia has_foreign
definita l'altra chiave del modello .
Per essere più specifici, ci sono due lati di relationship
, uno è l' Owner
altro e l'altro è Belongings
. Se has_one
viene definito solo possiamo ottenere il suo Belongings
ma non possiamo ottenere Owner
dal belongings
. Per rintracciare Owner
è necessario definire belongs_to
anche 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_one
perché has_one
, dovresti aggiungere i seguenti vincoli al modello e alla tabella che ha la chiave esterna per imporre la has_one
relazione:
validates :foreign_key, presence: true, uniqueness: true