Quelle est la différence entre a belongs_to
et a has_one
?
La lecture du guide Ruby on Rails ne m'a pas aidé.
ruby-on-rails
activerecord
Blankman
la source
la source
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 unProfile
, alors dans laUser
classe que vous auriezhas_one :profile
et dans laProfile
classe que vous auriezbelongs_to :user
. Pour déterminer qui "possède" l'autre objet, regardez où se trouve la clé étrangère. On peut dire qu'unUser
"a" unProfile
parce que laprofiles
table a uneuser_id
colonne. S'il y avait une colonne appeléeprofile_id
sur lausers
table, cependant, nous dirions que aProfile
a unUser
, et les emplacements appartiennent_to / has_one seraient échangés.voici une explication plus détaillée.
la source
Product belongs_to Shop
signifie que laproducts
table a uneshop_id
colonneIl s'agit de l'emplacement de la clé étrangère.
belongs_to :bar
, alors la table foos a unebar_id
colonnehas_one :bar
, alors la table des barres a unefoo_id
colonneSur le plan conceptuel, si vous avez
class A
unehas_one
relation avec,class B
alorsclass A
est le parent de, parclass B
conséquent, vousclass B
aurez unebelongs_to
relation avecclass A
puisque c'est l'enfant declass 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.Les tableaux de ces classes pourraient ressembler à quelque chose comme:
la source
Account
etUser
dans cet exemple est regrettable car il arrive souvent qu'un compte puisse avoir de nombreux utilisateurs.has_one
etbelongs_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 leforeign_key
défini.has_one
s'assure que l'autrehas_foreign
clé de modèle définie.Pour être plus précis, il y a deux côtés
relationship
, l'un est leOwner
et l'autre estBelongings
. Si seulementhas_one
est défini, nous pouvons obtenir sonBelongings
mais pas leOwner
depuis lebelongings
. Pour tracer le,Owner
nous devons également définir lebelongs_to
dans le modèle d'appartenance.la source
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,
Mais pour un livre particulier, nous ne pouvons pas obtenir l'auteur correspondant,
pour que le code ci-dessus fonctionne, nous devons également ajouter une association au modèle Book, comme ceci
Cela ajoutera la méthode «auteur» au modèle de livre.
Pour plus de détails sur les modes, consultez les guides
la source
Du point de vue de la simplicité,
belongs_to
c'est mieux quehas_one
parce que danshas_one
, vous devrez ajouter les contraintes suivantes au modèle et à la table contenant la clé étrangère pour appliquer lahas_one
relation:validates :foreign_key, presence: true, uniqueness: true
la source