Quelle est la différence entre t.belongs_to et t.references dans les rails?

123

Quelle est la différence entre t.referenceset t.belongs_to? Pourquoi avons-nous ces deux mots différents? Il me semble qu'ils font la même chose? J'ai essayé une recherche sur Google, mais je n'ai trouvé aucune explication.

class CreateFoos < ActiveRecord::Migration
  def change
    create_table :foos do |t|
      t.references :bar
      t.belongs_to :baz
      # The two above seems to give similar results
      t.belongs_to :fooable, :polymorphic => true
      # I have not tried polymorphic with t.references
      t.timestamps
    end
  end
end
Tornskaden
la source
1
Ils fonctionnent de la même manière - est-ce une si mauvaise chose? références insère une colonne de clé étrangère pour vous. Vous pouvez utiliser à la place appart_to pour rendre votre migration plus lisible. Voir guides.rubyonrails.org/migrations.html pour quelques détails.
muffinista
1
Ne pas dire que c'est une mauvaise chose. Je suis juste confus quant à savoir s'ils fonctionnent de la même manière ou de manière différente, car je ne trouve aucune documentation précisant qu'ils fonctionnent de la même manière. http://guides.rubyonrails.org/migrations.html n'est pas non plus clair à ce sujet.
Tornskaden
3
Ceci est probablement juste pour la compatibilité descendante et referencessera obsolète et supprimé dans une prochaine version de rails. Ne me croyez pas sur parole, c'est juste une supposition éclairée.
bricker
"L'autre aide s'appelle des références (également disponible sous le nom appartenant à). Dans sa forme la plus simple, il ajoute juste une certaine lisibilité" - du guide
muffinista
5
Voici aussi le code source - appartient_to est un alias direct de références github.com/rails/rails/blob/…
muffinista

Réponses:

161

En regardant le code source , ils font exactement la même chose - belongs_toest un alias de reference:

  def references(*args)
    options = args.extract_options!
    polymorphic = options.delete(:polymorphic)
    args.each do |col|
      column("#{col}_id", :integer, options)
      column("#{col}_type", :string, polymorphic.is_a?(Hash) ? polymorphic : options) unless polymorphic.nil?
    end
  end
  alias :belongs_to :references

C'est juste un moyen de rendre votre code plus lisible - c'est bien de pouvoir mettre belongs_todans vos migrations le cas échéant, et de s'en tenir à referencesd'autres types d'associations.

muffinista
la source
Je me demande s'ils vont le garder comme ça à l'avenir ou s'ils vont en supprimer un !? Je l'aime de cette façon, pouvoir choisir celui qui fait que mon code ressemble le plus au vrai anglais.
Tornskaden
Je suppose que les deux sont là pour rester. En regardant les journaux de commit, c'est comme ça depuis 2007.
muffinista
4
IMO, referencesest un choix ambigu pour un terme. Ils ont renommé before_filteren before_action, ce qui était une bonne décision car cela réduisait l'ambiguïté. L'un des avantages referencesest qu'il est simplement différent de ce que vous utilisez dans le modèle, de sorte que vous êtes moins confus si vous êtes dans le modèle ou dans la migration. Mais tout terme différent satisferait à ce critère.
ahnbizcad
2
L'OMI referencesest un meilleur terme au niveau de la base de données.
vasilakisfil
1
Je ne pense pas vraiment qu'ils veulent dire la même chose en anglais ... Donc c'est un peu bizarre.
xji