В чем разница между t.belongs_to и t.references в рельсах?

В чем разница между t.references и t.belongs_to? Почему у нас есть эти два разных слова? Мне кажется, что они делают то же самое? Пробовал поиск в Google, но не нашел объяснений.

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

Глядя на исходный код, они делают то же самое - belongs_to является псевдонимом 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

Это всего лишь способ сделать ваш код более читабельным - приятно иметь возможность переносить belongs_to в ваши миграции, когда это необходимо, и придерживаться references для других видов ассоциаций.