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.