Яка різниця між 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

1
Вони працюють так само - це така погана справа? посилання вставляє для вас стовпчик із іноземним ключем. Ви можете скористатися last_to замість цього, щоб зробити міграцію більш читаною. Детальнішу інформацію див. У розділі guides.rubyonrails.org/migrations.html .
muffinista

1
Не кажучи, що це погано. Просто заплутався, якщо вони працюють однаково чи різними способами, оскільки я не можу знайти жодної документації, яка б точно сказала, що вони працюють однаково. http://guides.rubyonrails.org/migrations.html з цього питання також не зрозуміло.
Tornskaden

3
Це, ймовірно, лише для зворотної сумісності, і referencesбуде видалено та видалено в майбутньому випуску рейок. Не сприймайте мого слова з цього приводу, це лише здогадка.
цегельник

"Інший помічник називається посиланням (також доступний як last_to). У своїй найпростішій формі він просто додає певної читабельності" - з керівництва
muffinista

5
Також ось вихідний код - pripada_то - прямий псевдонім посилань 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інших видів асоціацій.


Цікаво, чи збираються вони зберегти це у майбутньому чи збираються видалити когось із них !? Мені це подобається таким чином, що я можу обирати те, що робить мій код схожим на справжню англійську.
Tornskaden

Я б здогадався, що обидва тут залишилися. Дивлячись на журнали фіксації, так було з 2007 року.
muffinista

4
IMO, referencesє неоднозначним вибором терміну. Вони перейменовані before_filterна before_action, що було хорошим кроком, оскільки це зменшило неоднозначність. Однією з переваг referencesє те, що він просто відрізняється від того, що ви використовуєте в моделі, тому ви менше плутаєтесь, якщо ви перебуваєте в моделі чи міграції. Але будь-який термін, який відрізняється, відповідав би цим критеріям.
ahnbizcad

2
ІМО references- кращий термін на рівні db.
vasilakisfil

1
Я дійсно не думаю, що вони насправді означають те саме, що англійською мовою ... Так це дивно.
xji
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.