Jawaban:
Mereka pada dasarnya melakukan hal yang sama, satu-satunya perbedaan adalah di sisi mana hubungan Anda berada. Jika a User
memiliki Profile
, maka di User
kelas Anda akan memiliki has_one :profile
dan di Profile
kelas yang Anda miliki belongs_to :user
. Untuk menentukan siapa "memiliki" objek lain, lihat di mana kunci asing berada. Kita dapat mengatakan bahwa User
"memiliki" a Profile
karena profiles
tabel memiliki user_id
kolom. Namun, jika ada kolom bernama profile_id
pada users
tabel, kita akan mengatakan bahwa a Profile
memiliki User
, dan lokasi milik_to / has_one akan ditukar.
di sini adalah penjelasan yang lebih rinci.
Product belongs_to Shop
artinya products
tabel memiliki shop_id
kolom
Ini tentang di mana kunci asing berada.
class Foo < AR:Base
end
belongs_to :bar
, maka tabel foos memiliki bar_id
kolomhas_one :bar
, maka tabel bilah memiliki foo_id
kolomPada level konseptual, jika Anda class A
memiliki has_one
hubungan dengan class B
maka class A
adalah orang tua class B
maka Anda class B
akan memiliki belongs_to
hubungan dengan class A
karena itu adalah anak dari class 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.
class User < ActiveRecord::Base
# I reference an account.
belongs_to :account
end
class Account < ActiveRecord::Base
# One user references me.
has_one :user
end
Tabel untuk kelas-kelas ini dapat terlihat seperti:
CREATE TABLE users (
id int(11) NOT NULL auto_increment,
account_id int(11) default NULL,
name varchar default NULL,
PRIMARY KEY (id)
)
CREATE TABLE accounts (
id int(11) NOT NULL auto_increment,
name varchar default NULL,
PRIMARY KEY (id)
)
Account
dan User
dalam contoh ini sangat disayangkan karena sering kali suatu Akun dapat memiliki banyak pengguna.
has_one
dan belongs_to
umumnya sama dalam arti bahwa mereka menunjuk ke model terkait lainnya. belongs_to
pastikan bahwa model ini telah foreign_key
ditentukan.
has_one
memastikan bahwa has_foreign
kunci model lain ditentukan.
Untuk lebih spesifik, ada dua sisi relationship
, satu adalah Owner
dan yang lainnya Belongings
. Jika hanya has_one
didefinisikan kita bisa mendapatkan Belongings
tetapi tidak bisa mendapatkan Owner
dari belongings
. Untuk melacak, Owner
kita perlu mendefinisikan belongs_to
juga dalam model yang dimiliki.
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,
@books = @author.books
Tetapi untuk buku tertentu kita tidak bisa mendapatkan penulis yang sesuai dengan,
@author = @book.author
untuk membuat kode di atas berfungsi, kita perlu menambahkan asosiasi ke model Buku juga, seperti ini
class Book < ApplicationRecord
belongs_to :author
end
Ini akan menambahkan metode 'penulis' ke model Buku.
Untuk detail mode, lihat panduan
Dari sudut pandang kesederhanaan, belongs_to
lebih baik daripada has_one
karena dalam has_one
, Anda harus menambahkan batasan berikut pada model dan tabel yang memiliki kunci asing untuk menegakkan has_one
hubungan:
validates :foreign_key, presence: true, uniqueness: true