Différence entre a un et appartient à dans Rails? [dupliquer]
Cette question a déjà une réponse ici:
J'essaie de comprendre la relation has_one
dans RoR.
Imaginons que j'ai deux modèles - Person
et Cell
:
class Person < ActiveRecord::Base
has_one :cell
end
class Cell < ActiveRecord::Base
belongs_to :person
end
Puis-je simplement utiliser has_one :person
au lieu de belongs_to :person
dans le modèle Cell
?
N'est-ce pas pareil?
3 réponses
Non, ils ne sont pas interchangeables, et il y a des différences réelles.
belongs_to
signifie que la clé étrangère dans la table pour cette classe. Donc belongs_to
ne peut aller que dans la classe qui contient la clé étrangère.
has_one
signifie qu'il y a une clé étrangère dans une autre table qui fait référence à cette classe. Donc has_one
ne peut aller que dans une classe référencée par une colonne dans une autre table.
, Donc c'est faux:
class Person < ActiveRecord::Base
has_one :cell # the cell table has a person_id
end
class Cell < ActiveRecord::Base
has_one :person # the person table has a cell_id
end
Ainsi est-ce:
class Person < ActiveRecord::Base
belongs_to :cell # the person table has a cell_id
end
class Cell < ActiveRecord::Base
belongs_to :person # the cell table has a person_id
end
Pour une association bidirectionnelle, vous avez besoin d'un de chaque, et ils doivent aller dans la bonne classe. Même pour une association à Sens Unique, il importe lequel vous utilisez.
Si vous ajoutez "belongs_to", vous avez une association bidirectionnelle. Cela signifie que vous pouvez obtenir une personne de la cellule et une cellule de la personne.
Il n'y a pas de différence réelle, les deux approches (avec et sans "belongs_to") utilisent le même schéma de base de données (un champ person_id dans la table de base de données de cellules).
Pour résumer: n'ajoutez pas "belongs_to" sauf si vous avez besoin d'associations bidirectionnelles entre les modèles.
L'utilisation des deux vous permet d'obtenir des informations à partir des modèles de personne et de cellule.
@cell.person.whatever_info and @person.cell.whatever_info.