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?

Était-ce utile?

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.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top