Réponses:
Ils font essentiellement la même chose, la seule différence est de quel côté de la relation vous êtes. Si a User
a un Profile
, alors dans la User
classe que vous auriez has_one :profile
et dans la Profile
classe que vous auriez belongs_to :user
. Pour déterminer qui "possède" l'autre objet, regardez où se trouve la clé étrangère. On peut dire qu'un User
"a" un Profile
parce que la profiles
table a une user_id
colonne. S'il y avait une colonne appelée profile_id
sur la users
table, cependant, nous dirions que a Profile
a un User
, et les emplacements appartiennent_to / has_one seraient échangés.
voici une explication plus détaillée.
Product belongs_to Shop
signifie que la products
table a une shop_id
colonne
Il s'agit de l'emplacement de la clé étrangère.
class Foo < AR:Base
end
belongs_to :bar
, alors la table foos a une bar_id
colonnehas_one :bar
, alors la table des barres a une foo_id
colonneSur le plan conceptuel, si vous avez class A
une has_one
relation avec, class B
alors class A
est le parent de, par class B
conséquent, vous class B
aurez une belongs_to
relation avec class A
puisque c'est l'enfant de class A
.
Les deux expriment une relation 1-1. La différence réside principalement dans l'emplacement de la clé étrangère, qui va sur la table de la classe déclarant la belongs_to
relation.
class User < ActiveRecord::Base
# I reference an account.
belongs_to :account
end
class Account < ActiveRecord::Base
# One user references me.
has_one :user
end
Les tableaux de ces classes pourraient ressembler à quelque chose comme:
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
et User
dans cet exemple est regrettable car il arrive souvent qu'un compte puisse avoir de nombreux utilisateurs.
has_one
et belongs_to
sont généralement les mêmes en ce sens qu'ils pointent vers l'autre modèle connexe. belongs_to
assurez-vous que ce modèle a le foreign_key
défini.
has_one
s'assure que l'autre has_foreign
clé de modèle définie.
Pour être plus précis, il y a deux côtés relationship
, l'un est le Owner
et l'autre est Belongings
. Si seulement has_one
est défini, nous pouvons obtenir son Belongings
mais pas le Owner
depuis le belongings
. Pour tracer le, Owner
nous devons également définir le belongs_to
dans le modèle d'appartenance.
Une chose supplémentaire que je veux ajouter est, supposons que nous ayons l'association de modèles suivante
class Author < ApplicationRecord
has_many :books
end
si nous n'écrivons que l'association ci-dessus, nous pouvons obtenir tous les livres d'un auteur particulier par,
@books = @author.books
Mais pour un livre particulier, nous ne pouvons pas obtenir l'auteur correspondant,
@author = @book.author
pour que le code ci-dessus fonctionne, nous devons également ajouter une association au modèle Book, comme ceci
class Book < ApplicationRecord
belongs_to :author
end
Cela ajoutera la méthode «auteur» au modèle de livre.
Pour plus de détails sur les modes, consultez les guides
Du point de vue de la simplicité, belongs_to
c'est mieux que has_one
parce que dans has_one
, vous devrez ajouter les contraintes suivantes au modèle et à la table contenant la clé étrangère pour appliquer la has_one
relation:
validates :foreign_key, presence: true, uniqueness: true