Was ist der Unterschied zwischen t.belongs_to und t.references in Schienen?

123

Was ist der Unterschied zwischen t.referencesund t.belongs_to? Warum haben wir diese zwei verschiedenen Wörter? Mir scheint, sie machen das Gleiche? Versuchte einige Google-Suche, aber keine Erklärung zu finden.

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
quelle
1
Sie arbeiten genauso - ist das so eine schlechte Sache? Referenzen fügt eine Fremdschlüsselspalte für Sie ein. Sie können stattdessen Gehorsame verwenden, um Ihre Migration besser lesbar zu machen. Weitere Informationen finden Sie unter guide.rubyonrails.org/migrations.html .
Muffinista
1
Nicht zu sagen, dass es eine schlechte Sache ist. Ich war nur verwirrt darüber, ob sie gleich oder auf unterschiedliche Weise funktionieren, da ich keine Dokumentation finden kann, die spezifisch besagt, dass sie gleich funktionieren. http://guides.rubyonrails.org/migrations.html ist auch in dieser Angelegenheit nicht klar.
Tornskaden
3
Dies ist wahrscheinlich nur aus Gründen der Abwärtskompatibilität und referenceswird in einer zukünftigen Version von Schienen veraltet und entfernt. Nehmen Sie nicht mein Wort, es ist nur eine fundierte Vermutung.
Maurer
"Der andere Helfer heißt Referenzen (auch als Gehört_zu verfügbar). In seiner einfachsten Form fügt er nur eine gewisse Lesbarkeit hinzu" - aus dem Leitfaden
Muffinista
5
Auch hier ist der Quellcode - Gehört_zu ist ein direkter Alias ​​von Referenzen github.com/rails/rails/blob/…
muffinista

Antworten:

161

Wenn sie sich den Quellcode ansehen , tun sie genau das Gleiche - belongs_toist ein Alias ​​von 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

Dies ist nur eine Möglichkeit, Ihren Code besser lesbar zu machen. Es ist schön, belongs_towenn Sie Ihre Migrationen gegebenenfalls einfügen und sich an referencesandere Arten von Assoziationen halten können.

Muffinista
quelle
Ich frage mich, ob sie es in Zukunft so behalten oder eines davon entfernen werden!? Ich mag es so, wenn ich wählen kann, was meinen Code eher wie echtes Englisch aussehen lässt.
Tornskaden
Ich würde vermuten, dass beide hier sind, um zu bleiben. Mit Blick auf die Commit-Protokolle ist dies seit 2007 der
Fall
4
IMO referencesist eine mehrdeutige Wahl für einen Begriff. Sie umbenannt before_filterzu before_action, was ein guter Schachzug war , weil es Mehrdeutigkeit reduziert. Ein Vorteil von referencesist, dass es sich einfach von dem unterscheidet, was Sie im Modell verwenden, sodass Sie weniger verwirrt sind, wenn Sie sich im Modell oder in der Migration befinden. Jeder andere Begriff würde diese Kriterien erfüllen.
Ahnbizcad
2
IMO referencesist ein besserer Begriff auf DB-Ebene.
Vasilakisfil
1
Ich denke nicht wirklich, dass sie auf Englisch dasselbe bedeuten ... Also ist es ein bisschen komisch.
Xji