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.


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)
)

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.


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


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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.