Qual è la differenza tra t.belongs_to e t.references in rails?


123

Qual'è la differenza tra t.referencese t.belongs_to? Perché abbiamo queste due parole diverse? Mi sembra che facciano la stessa cosa? Ho provato qualche ricerca su Google, ma non ho trovato spiegazioni.

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

1
Funzionano allo stesso modo - è una cosa così brutta? i riferimenti inseriscono una colonna chiave esterna per te. Puoi utilizzare invece appartiene_to per rendere la tua migrazione più leggibile. Vedi guides.rubyonrails.org/migrations.html per alcuni dettagli.
muffinista

1
Non dire che è una cosa negativa. Mi sono solo confuso se funzionano allo stesso modo o in modi diversi, dal momento che non riesco a trovare alcuna documentazione specifica che dica che funzionano allo stesso modo. Anche http://guides.rubyonrails.org/migrations.html non è chiaro su questo argomento.
Tornskaden

3
Questo è probabilmente solo per compatibilità con le versioni precedenti e referencessarà deprecato e rimosso in una futura versione di rails. Non credermi sulla parola, è solo un'ipotesi plausibile.
bricker

"L'altro helper si chiama riferimenti (disponibile anche come appartiene_to). Nella sua forma più semplice aggiunge solo un po 'di leggibilità" - dalla guida
muffinista

5
Inoltre, ecco il codice sorgente: appartiene_to è un alias diretto di riferimenti github.com/rails/rails/blob/…
muffinista

Risposte:


161

Guardando il codice sorgente , fanno la stessa identica cosa: belongs_toè un alias di 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

Questo è solo un modo per rendere il tuo codice più leggibile: è bello poter inserire le belongs_totue migrazioni quando appropriato e attenersi ad referencesaltri tipi di associazioni.


Mi chiedo se lo manterranno così in futuro o ne rimuoveranno uno !? Mi piace in questo modo, poter scegliere quello che fa sembrare il mio codice più simile al vero inglese.
Tornskaden

Immagino che entrambi siano qui per restare. Guardando i log di commit, è così dal 2007.
muffinista

4
IMO, referencesè una scelta ambigua per un termine. Hanno rinominato before_filterin before_action, che era una buona mossa perché riduceva l'ambiguità. Un vantaggio di referencesè che è semplicemente diverso da ciò che usi nel modello, quindi ti confondi meno se sei nel modello o nella migrazione. Ma qualsiasi termine diverso soddisferebbe questo criterio.
ahnbizcad

2
IMO referencesè un termine migliore a livello di database.
vasilakisfil

1
Non credo davvero che significhino la stessa cosa in inglese ... Quindi è un po 'strano.
xji
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.