Yanıtlar:
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.
Product belongs_to Shopanlamına gelirproductsshop_id
Yabancı anahtarın nerede oturduğu hakkında.
class Foo < AR:Base
end
belongs_to :bar, foos tablosunun bir bar_idsütunu vardırhas_one :bar, çubuklar tablosunun bir foo_idsütunu vardırEğ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)
)
Accountve Usergenellikle bir Hesap birçok kullanıcısı olabilir durumdur çünkü bu örnekte talihsizliktir.
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.
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
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