Apa perbedaan antara hers_to dan has_one?

Jawaban:

241

Mereka pada dasarnya melakukan hal yang sama, satu-satunya perbedaan adalah di sisi mana hubungan Anda berada. Jika a Usermemiliki Profile, maka di Userkelas Anda akan memiliki has_one :profiledan di Profilekelas 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 Profilekarena profilestabel memiliki user_idkolom. Namun, jika ada kolom bernama profile_idpada userstabel, kita akan mengatakan bahwa a Profilememiliki User, dan lokasi milik_to / has_one akan ditukar.

di sini adalah penjelasan yang lebih rinci.

ryeguy
sumber
ok masuk akal, has_a adalah properti, sedangkan milik lebih merupakan hubungan.
Blankman
48
Jadi singkatnya: Product belongs_to Shopartinya productstabel memiliki shop_idkolom
Yo Ludke
@ryeguy, bagaimana kalau ini adalah hubungan self-join?
Arian Faurtosh
49

Ini tentang di mana kunci asing berada.

class Foo < AR:Base
end
  • Jika foo belongs_to :bar, maka tabel foos memiliki bar_idkolom
  • Jika foo has_one :bar, maka tabel bilah memiliki foo_idkolom

Pada level konseptual, jika Anda class Amemiliki has_onehubungan dengan class Bmaka class Aadalah orang tua class Bmaka Anda class Bakan memiliki belongs_tohubungan dengan class Akarena 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_tohubungan.

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)
)
Chandan Kumar Mallik
sumber
Itu hampir sama dengan jawaban yang diterima dari dua tahun lalu sudah menyatakan.
matthias krull
11
Ini jawaban yang jauh lebih baik.
typeoneerror
Penggunaan Accountdan Userdalam contoh ini sangat disayangkan karena sering kali suatu Akun dapat memiliki banyak pengguna.
karmakaze
5

has_onedan belongs_toumumnya sama dalam arti bahwa mereka menunjuk ke model terkait lainnya. belongs_topastikan bahwa model ini telah foreign_keyditentukan. has_onememastikan bahwa has_foreignkunci model lain ditentukan.

Untuk lebih spesifik, ada dua sisi relationship, satu adalah Ownerdan yang lainnya Belongings. Jika hanya has_onedidefinisikan kita bisa mendapatkan Belongingstetapi tidak bisa mendapatkan Ownerdari belongings. Untuk melacak, Ownerkita perlu mendefinisikan belongs_tojuga dalam model yang dimiliki.

pemain sulap
sumber
3

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

Somesh Sharma
sumber
0

Dari sudut pandang kesederhanaan, belongs_tolebih baik daripada has_onekarena dalam has_one, Anda harus menambahkan batasan berikut pada model dan tabel yang memiliki kunci asing untuk menegakkan has_onehubungan:

  • validates :foreign_key, presence: true, uniqueness: true
  • tambahkan indeks unik basis data pada kunci asing.
konyak
sumber