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.