Apa perbedaan antara t.belongs_to dan t.references di rails?

123

Apa perbedaan antara t.referencesdan t.belongs_to? Mengapa kita memiliki dua kata yang berbeda itu? Menurut saya mereka melakukan hal yang sama? Mencoba beberapa pencarian Google, tetapi tidak menemukan penjelasan.

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
sumber
1
Mereka melakukan pekerjaan yang sama - apakah itu hal yang buruk? referensi menyisipkan kolom kunci asing untuk Anda. Anda dapat menggunakan milik_to untuk membuat migrasi Anda lebih mudah dibaca. Lihat panduan.rubyonrails.org/migrations.html untuk beberapa detail.
muffinista
1
Tidak mengatakan itu hal yang buruk. Hanya menjadi bingung tentang apakah mereka bekerja dengan cara yang sama atau berbeda, karena saya tidak dapat menemukan dokumentasi yang secara khusus mengatakan bahwa mereka bekerja dengan cara yang sama. http://guides.rubyonrails.org/migrations.html juga tidak jelas tentang hal itu.
Tornskaden
3
Ini kemungkinan hanya untuk kompatibilitas ke belakang dan referencesakan ditinggalkan dan dihapus di rilis rel yang akan datang. Jangan percaya kata-kata saya ini, itu hanya tebakan yang cerdas.
tukang batu
"Pembantu lain disebut referensi (juga tersedia sebagai milik_to). Dalam bentuk yang paling sederhana, ia hanya menambahkan sedikit keterbacaan" - dari panduan
muffinista
5
Juga di sini kode sumber - milik_to adalah alias langsung dari referensi github.com/rails/rails/blob/…
muffinista

Jawaban:

161

Melihat kode sumber , mereka melakukan hal yang persis sama - belongs_toadalah alias dari 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

Ini hanyalah cara untuk membuat kode Anda lebih mudah dibaca - senang dapat memasukkan belongs_tomigrasi Anda bila perlu, dan tetap berpegang pada referencesjenis asosiasi lainnya.

muffinista
sumber
Aku ingin tahu apakah mereka akan tetap seperti ini di masa depan atau mereka akan menyingkirkan salah satunya !? Saya suka cara ini, dapat memilih mana saja yang membuat kode saya terlihat lebih seperti bahasa Inggris asli.
Tornskaden
Saya akan menebak bahwa keduanya di sini untuk tinggal. Melihat log komit, sudah seperti ini sejak 2007.
muffinista
4
IMO, referencesadalah pilihan yang ambigu untuk sebuah istilah. Mereka berganti nama before_filtermenjadibefore_action , yang merupakan langkah yang baik karena mengurangi ambiguitas. Salah satu keuntungannya referencesadalah bahwa ini hanya berbeda dari apa yang Anda gunakan dalam model, jadi Anda tidak terlalu bingung jika Anda berada dalam model atau migrasi. Tetapi istilah apa pun yang berbeda akan memenuhi kriteria ini.
ahnbizcad
2
IMO referencesadalah istilah yang lebih baik di tingkat db.
vasilakisfil
1
Saya tidak benar-benar berpikir mereka sebenarnya memiliki arti yang sama dalam bahasa Inggris ... Jadi agak aneh.
xji