79 votes

Différence entre has_one et belongs_to dans les Rails?

J'essaie de comprendre has_one relation en ruby on rails.

disons que j'ai deux modèles de la Personne et de la Cellule

class Person < ActiveRecord::Base
  has_one : cell
end

class Cell < ActiveRecord::Base
  belongs_to : person
end

puis-je utiliser le has_one: personne au lieu de belongs_to : personne dans la Cellule modèle?

n'est-il pas de même?

184voto

Sarah Mei Points 10673

Non, ils ne sont pas interchangeables, et il y a de vraies différences.

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 qui est référencé par une colonne d'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

Alors, 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 les deux sens de l'association, il vous en faut un de chaque, et ils ont à aller dans la bonne classe. Même pour une association, il importe celui que vous utilisez.

15voto

Pablo Fernandez Points 32003

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 réelle différence, les deux approches (avec et sans "belongs_to") utilisent le même schéma de base de données (un person_id champ dans les cellules de la table de base de données).

Pour résumer: Ne pas ajouter "belongs_to" sauf si vous avez besoin bidirectionnel associations entre les modèles.

7voto

Jarrod Points 2049

En utilisant à la fois vous permet d'obtenir des informations provenant à la fois de la Personne et des modèles de Cellules.

@cell.person.whatever_info and @person.cell.whatever_info.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X