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

123

В чем разница между 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
Tornskaden
источник
1
Они работают одинаково - разве это плохо? Ссылки вставляет для вас столбец внешнего ключа. Вместо этого вы можете использовать own_to, чтобы сделать вашу миграцию более читаемой. Подробнее см. Guides.rubyonrails.org/migrations.html .
muffinista
1
Не сказать, что это плохо. Просто запутался, работают ли они одинаково или по-разному, поскольку я не могу найти никакой документации, в которой говорится, что они работают одинаково. http://guides.rubyonrails.org/migrations.html также не совсем ясно по этому поводу.
Торнскаден
3
Скорее всего, это просто для обратной совместимости, и referencesв будущих версиях rails он будет исключен и удален. Не верьте мне на слово, это просто обоснованное предположение.
Брикер
«Другой помощник называется ссылками (также доступен как own_to). В своей простейшей форме он просто добавляет некоторую удобочитаемость» - из руководства
muffinista
5
Также вот исходный код - own_to - это прямой псевдоним ссылок github.com/rails/rails/blob/…
muffinista

Ответы:

161

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

muffinista
источник
Интересно, собираются ли они сохранить это в будущем или они собираются удалить одну из них !? Мне нравится, когда я могу выбирать то, что делает мой код более похожим на настоящий английский.
Торнскаден
Я предполагаю, что оба здесь, чтобы остаться. Судя по журналам коммитов, так было с 2007 года.
muffinista
4
ИМО, referencesэто неоднозначный выбор термина. Они переименовали before_filterв before_action, что было хорошим ходом, поскольку уменьшило двусмысленность. Одним из преимуществ referencesявляется то, что он просто отличается от того, что вы используете в модели, поэтому вы меньше запутаетесь, если вы используете модель или миграцию. Но любой другой термин удовлетворяет этим критериям.
ahnbizcad
2
IMO referencesлучше термин на уровне базы данных.
vasilakisfil
1
Я действительно не думаю, что они на самом деле означают одно и то же на английском ... Так что это немного странно.
xji 08