web-dev-qa-db-fra.com

Quelle est la différence entre has_one et has_one?

Quelle est la différence entre un belongs_to et un has_one?

Lire le guide Ruby on Rails ne m'a pas aidé.

117
Blankman

Ils font essentiellement la même chose, la seule différence est de quel côté de la relation vous êtes. Si un User a un Profile, dans la classe User vous auriez has_one :profile et dans la classe Profile, vous auriez belongs_to :user. Pour déterminer qui "a" l'autre objet, regardez où se trouve la clé étrangère. Nous pouvons dire qu'une User "a" une Profile car la table profiles a une colonne user_id. Cependant, s'il existait une colonne appelée profile_id dans la table users, nous dirions qu'une Profile a une User et que les emplacements d'appartenance_to/has_one seraient échangés.

ici est une explication plus détaillée.

188
ryeguy

Il s'agit de l'emplacement de la clé étrangère.

class Foo < AR:Base
end
  • Si foo belongs_to :bar, alors la table foos a une colonne bar_id
  • Si foo has_one :bar, alors la table des barres a une colonne foo_id

Sur le plan conceptuel, si votre class A a une relation has_one avec class B, alors class A est le parent de class B, votre class B aura donc une relation belongs_to avec class A puisqu'il s'agit de l'enfant de class A.

Les deux expriment une relation 1-1. La différence est principalement l'endroit où placer la clé étrangère, qui va sur la table pour la classe déclarant la relation belongs_to.

class User < ActiveRecord::Base
  # I reference an account.
  belongs_to :account
end

class Account < ActiveRecord::Base
  # One user references me.
  has_one :user
end

Les tables de ces classes pourraient ressembler à quelque chose comme:

CREATE TABLE users (
  id int(11) NOT NULL auto_increment,
  account_id int(11) default NULL,
  name varchar default NULL,
  PRIMARY KEY  (id)
)

CREATE TABLE accounts (
  id int(11) NOT NULL auto_increment,
  name varchar default NULL,
  PRIMARY KEY  (id)
)
37

has_one et belongs_to sont généralement identiques en ce sens qu'ils renvoient à l'autre modèle associé. belongs_to assurez-vous que ce modèle a le foreign_key défini . has_one s'assure que l'autre clé has_foreign du modèle est définie. 

Pour être plus précis, il y a deux côtés de relationship, l’un est le Owner et l’autre est Belongings. Si seul has_one est défini, nous pouvons obtenir son Belongings mais nous ne pouvons pas obtenir le Owner à partir de belongings. Pour suivre le Owner, nous devons également définir le belongs_to dans le modèle d’appartenance.

4
illusionist

Une chose supplémentaire que je veux ajouter est, supposons que nous ayons l'association suivante de modèles

class Author < ApplicationRecord has_many :books end

si nous n'écrivons que l'association ci-dessus, nous pouvons obtenir tous les livres d'un auteur en particulier par,

@books = @author.books

Mais pour un livre particulier, nous ne pouvons pas obtenir l'auteur correspondant par, 

@author = @book.author

pour que le code ci-dessus fonctionne, nous devons également ajouter une association au modèle Book, comme ceci

class Book < ApplicationRecord
  belongs_to :author
end

Cela ajoutera la méthode 'auteur' au modèle de livre.
Pour plus de détails sur le mode, voir guides

0
Somesh Sharma