Belongs_to ve has_one arasındaki fark nedir?


Yanıtlar:


241

Aslında aynı şeyi yapıyorlar, tek fark ilişkinin hangi tarafında olduğun. Bir Eğer Userbir sahiptir Profile, ardından Usersınıfın ederdiniz has_one :profileve Profilesınıfta ederdiniz belongs_to :user. Diğer nesneye kimin "sahip" olduğunu belirlemek için yabancı anahtarın nerede olduğuna bakın. Tablonun bir sütunu olduğu için bir User"has" a diyebiliriz . Adında bir sütun varsa üzerine masaya Ancak biz söyleyebilirim bir sahiptir ve belongs_to / has_one yerleri takas olacaktır.Profileprofilesuser_idprofile_idusersProfileUser

İşte daha ayrıntılı bir açıklama.


Tamam mantıklı, has_a mülkiyet, ait olmak ise daha çok bir ilişki.
— Blankman

48
Yani gerçekten kısaca söylemek gerekirse: tablonun sütun olduğu Product belongs_to Shopanlamına gelirproductsshop_id
— Yo Ludke

@ryeguy, bu kendi kendine bir ilişki ise ne olacak?
— Arian Faurtosh

49

Yabancı anahtarın nerede oturduğu hakkında.

class Foo < AR:Base
end
  • Foo ise belongs_to :bar, foos tablosunun bir bar_idsütunu vardır
  • Eğer foo ise has_one :bar, çubuklar tablosunun bir foo_idsütunu vardır

Eğer senin kavramsal seviyede, class Abir var has_oneolan ilişkiyi class Bdaha sonra class Aüstüdür class Bdolayısıyla senin class Bbir olacak belongs_toolan ilişkisini class Ao çocuğu olduğu için class A.

Her ikisi de 1-1 ilişkisini ifade eder. Aradaki fark çoğunlukla belongs_toilişkiyi açıklayan sınıfın masasına giden yabancı anahtarın nereye yerleştirileceğidir .

class User < ActiveRecord::Base
  # I reference an account.
  belongs_to :account
end

class Account < ActiveRecord::Base
  # One user references me.
  has_one :user
end

Bu sınıfların tabloları aşağıdaki gibi görünebilir:

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

İki yıl önceki kabul edilen cevap zaten aynı.
— matthias krull

11
Bu hemen hemen daha iyi bir cevap.
— typeoneerror

Kullanımı Accountve Usergenellikle bir Hesap birçok kullanıcısı olabilir durumdur çünkü bu örnekte talihsizliktir.
— karmakaze

5

has_oneve belongs_togenellikle diğer ilgili modele işaret ettikleri anlamında aynıdır. belongs_tobu modelin foreign_keytanımlı olduğundan emin olun . has_onediğer model has_foreignanahtarının tanımlandığından emin olur .

Daha spesifik olmak gerekirse, iki tarafı vardır relationship, biri Ownerdiğeri Belongings. Keşke has_onetanımlanır onun alabilirsiniz Belongingsama olamıyorum Ownerdan belongings. İzlemek için ait olan modelde de Ownertanımlamamız gerekir belongs_to.


3

Eklemek istediğim başka bir şey de varsayalım ki aşağıdaki modeller ilişkimiz var

class Author < ApplicationRecord has_many :books end

sadece yukarıdaki derneği yazarsak, belirli bir yazarın tüm kitaplarını şu şekilde alabiliriz,

@books = @author.books

Ancak belirli bir kitap için ilgili yazara ulaşamayız,

@author = @book.author

Yukarıdaki kodun işe yaraması için, Kitap modeline de böyle eklememiz gerekir.

class Book < ApplicationRecord
  belongs_to :author
end

Bu, Kitap modeline 'yazar' yöntemini ekleyecektir.
Mod ayrıntıları için kılavuzlara bakın


0

Bir basitlik açısından bakıldığında, belongs_todaha iyi olduğu has_onenedeniyle has_one, zorunlu tutmak yabancı anahtar vardır model ve tabloya aşağıdaki sınırlamaları eklemek olurdu has_oneilişki:

  • validates :foreign_key, presence: true, uniqueness: true
  • yabancı anahtarda benzersiz bir veritabanı dizini ekleyin.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.