¿Cuál es la diferencia entre t.belongs_to y t.references en rieles?

123

¿Cuál es la diferencia entre t.referencesy t.belongs_to? ¿Por qué estamos teniendo esas dos palabras diferentes? ¿Me parece que hacen lo mismo? Intenté algunas búsquedas en Google, pero no encontré ninguna explicación.

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
fuente
1
Funcionan igual, ¿es algo tan malo? referencias inserta una columna de clave externa para usted. En su lugar, podría usar belong_to para hacer que su migración sea más legible. Ver guías.rubyonrails.org / migrations.html para algunos detalles.
muffinista
1
No digo que sea algo malo. Me confundí si funcionan de la misma manera o de manera diferente, ya que no puedo encontrar documentación que diga específicamente que funcionen de la misma manera. http://guides.rubyonrails.org/migrations.html tampoco está claro al respecto.
Tornskaden
3
Es probable que esto sea solo por compatibilidad con versiones anteriores y referencesserá desaprobado y eliminado en una versión futura de rails. No confíes en esto, es solo una suposición educada.
bricker
"El otro ayudante se llama referencias (también disponible como pertenece_a). En su forma más simple, solo agrega cierta legibilidad" - de la guía
muffinista
55
También aquí está el código fuente: pertenece_to es un alias directo de referencias github.com/rails/rails/blob/…
muffinista

Respuestas:

161

Mirando el código fuente , hacen exactamente lo mismo: belongs_toes 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

Esta es solo una forma de hacer que su código sea más legible: es bueno poder realizar belongs_tosus migraciones cuando sea apropiado y apegarse a referencesotros tipos de asociaciones.

muffinista
fuente
¿Me pregunto si van a mantenerlo así en el futuro o van a eliminar uno de ellos? Me gusta de esta manera, poder elegir el que haga que mi código se parezca más al inglés real.
Tornskaden
Supongo que ambos están aquí para quedarse. Mirando los registros de confirmación, ha sido así desde 2007.
muffinista
44
OMI, referenceses una elección ambigua para un término. Cambiaron su nombre before_filtera before_action, lo cual fue un buen movimiento porque redujo la ambigüedad. Una ventaja referenceses que es simplemente diferente de lo que usa en el modelo, por lo que se confunde menos si está en el modelo o en la migración. Pero cualquier término que difiera satisfaría este criterio.
ahnbizcad
2
OMI referenceses mejor término en db-level.
vasilakisfil
1
Realmente no creo que realmente signifiquen lo mismo en inglés ... Así que es un poco extraño.
xji