Quelle est la différence entre un belongs_to
et un has_one
?
Lire le guide Ruby on Rails ne m'a pas aidé.
Ils font essentiellement la même chose, la seule différence est de quel côté de la relation vous êtes. Si un User
a un Profile
, dans la classe User
vous auriez has_one :profile
et dans la classe Profile
, vous auriez belongs_to :user
. Pour déterminer qui "a" l'autre objet, regardez où se trouve la clé étrangère. Nous pouvons dire qu'une User
"a" une Profile
car la table profiles
a une colonne user_id
. Cependant, s'il existait une colonne appelée profile_id
dans la table users
, nous dirions qu'une Profile
a une User
et que les emplacements d'appartenance_to/has_one seraient échangés.
ici est une explication plus détaillée.
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 colonne bar_id
has_one :bar
, alors la table des barres a une colonne foo_id
Sur le plan conceptuel, si votre class A
a une relation has_one
avec class B
, alors class A
est le parent de class B
, votre class B
aura donc une relation belongs_to
avec class A
puisqu'il s'agit de l'enfant de class A
.
Les deux expriment une relation 1-1. La différence est principalement l'endroit où placer la clé étrangère, qui va sur la table pour la classe déclarant la relation belongs_to
.
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 tables 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)
)
has_one
et belongs_to
sont généralement identiques en ce sens qu'ils renvoient à l'autre modèle associé. belongs_to
assurez-vous que ce modèle a le foreign_key
défini . has_one
s'assure que l'autre clé has_foreign
du modèle est définie.
Pour être plus précis, il y a deux côtés de relationship
, l’un est le Owner
et l’autre est Belongings
. Si seul has_one
est défini, nous pouvons obtenir son Belongings
mais nous ne pouvons pas obtenir le Owner
à partir de belongings
. Pour suivre 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 suivante de modèles
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 en particulier par,
@books = @author.books
Mais pour un livre particulier, nous ne pouvons pas obtenir l'auteur correspondant par,
@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 le mode, voir guides