Apa perbedaan antara a belongs_to
dan a has_one
?
Membaca panduan Ruby on Rails tidak membantu saya.
ruby-on-rails
activerecord
Blankman
sumber
sumber
Jawaban:
Mereka pada dasarnya melakukan hal yang sama, satu-satunya perbedaan adalah di sisi mana hubungan Anda berada. Jika a
User
memilikiProfile
, maka diUser
kelas Anda akan memilikihas_one :profile
dan diProfile
kelas yang Anda milikibelongs_to :user
. Untuk menentukan siapa "memiliki" objek lain, lihat di mana kunci asing berada. Kita dapat mengatakan bahwaUser
"memiliki" aProfile
karenaprofiles
tabel memilikiuser_id
kolom. Namun, jika ada kolom bernamaprofile_id
padausers
tabel, kita akan mengatakan bahwa aProfile
memilikiUser
, dan lokasi milik_to / has_one akan ditukar.di sini adalah penjelasan yang lebih rinci.
sumber
Product belongs_to Shop
artinyaproducts
tabel memilikishop_id
kolomIni tentang di mana kunci asing berada.
belongs_to :bar
, maka tabel foos memilikibar_id
kolomhas_one :bar
, maka tabel bilah memilikifoo_id
kolomPada level konseptual, jika Anda
class A
memilikihas_one
hubungan denganclass B
makaclass A
adalah orang tuaclass B
maka Andaclass B
akan memilikibelongs_to
hubungan denganclass A
karena itu adalah anak dariclass A
.Keduanya mengungkapkan hubungan 1-1. Perbedaannya adalah sebagian besar tempat menempatkan kunci asing, yang berada di atas meja untuk kelas yang menyatakan
belongs_to
hubungan.Tabel untuk kelas-kelas ini dapat terlihat seperti:
sumber
Account
danUser
dalam contoh ini sangat disayangkan karena sering kali suatu Akun dapat memiliki banyak pengguna.has_one
danbelongs_to
umumnya sama dalam arti bahwa mereka menunjuk ke model terkait lainnya.belongs_to
pastikan bahwa model ini telahforeign_key
ditentukan.has_one
memastikan bahwahas_foreign
kunci model lain ditentukan.Untuk lebih spesifik, ada dua sisi
relationship
, satu adalahOwner
dan yang lainnyaBelongings
. Jika hanyahas_one
didefinisikan kita bisa mendapatkanBelongings
tetapi tidak bisa mendapatkanOwner
daribelongings
. Untuk melacak,Owner
kita perlu mendefinisikanbelongs_to
juga dalam model yang dimiliki.sumber
Satu hal tambahan yang ingin saya tambahkan adalah, Misalkan kita memiliki asosiasi model berikut
class Author < ApplicationRecord has_many :books end
jika kita hanya menulis asosiasi di atas maka kita bisa mendapatkan semua buku dari penulis tertentu dengan,
Tetapi untuk buku tertentu kita tidak bisa mendapatkan penulis yang sesuai dengan,
untuk membuat kode di atas berfungsi, kita perlu menambahkan asosiasi ke model Buku juga, seperti ini
Ini akan menambahkan metode 'penulis' ke model Buku.
Untuk detail mode, lihat panduan
sumber
Dari sudut pandang kesederhanaan,
belongs_to
lebih baik daripadahas_one
karena dalamhas_one
, Anda harus menambahkan batasan berikut pada model dan tabel yang memiliki kunci asing untuk menegakkanhas_one
hubungan:validates :foreign_key, presence: true, uniqueness: true
sumber