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?

60
demandé sur rocknrollcanneverdie 2009-05-14 05:16:11

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.

147
répondu Sarah Mei 2009-05-14 06:51:14

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.

10
répondu Pablo Fernandez 2009-05-14 01:52:30

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.
7
répondu Jarrod 2009-05-14 01:31:39