Différence entre has_one et belongs_to dans Rails? [dupliquer]
-
21-08-2019 - |
Question
Cette question a déjà une réponse ici:
Je suis en train de comprendre la relation dans RoR has_one
.
Disons que j'ai deux modèles - et Person
Cell
:
class Person < ActiveRecord::Base
has_one :cell
end
class Cell < ActiveRecord::Base
belongs_to :person
end
Puis-je utiliser au lieu de juste has_one :person
dans belongs_to :person
modèle <=>?
est-il pas la même chose?
La solution
Non, ils ne sont pas interchangeables, et il y a des différences réelles.
belongs_to
signifie que la clé étrangère est dans la table pour cette classe. Alors, peut seulement aller has_one
dans la classe qui détient la clé étrangère.
Cell
signifie qu'il ya une clé étrangère dans une autre table qui fait référence à cette classe. Alors, peut seulement aller person_id
dans une classe qui est référencé par une colonne dans une autre table.
Alors que cela 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
Et ceci est également erroné:
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
La manière correcte est (si <=> contient <=> champ):
class Person < ActiveRecord::Base
has_one :cell # the person table does not have 'joining' info
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 chacun, et ils doivent aller dans la bonne classe. Même pour une association à sens unique, il importe celui que vous utilisez.
Autres conseils
Si vous ajoutez « belongs_to » alors 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 cellules).
Pour résumer:. Ne pas ajouter « belongs_to » à moins que vous avez besoin d'associations bidirectionnelles entre les modèles
utilisant à la fois permet d'obtenir des informations des deux modèles personne et cellulaires.
@cell.person.whatever_info and @person.cell.whatever_info.