Yanıtlar:
Aslında aynı şeyi yapıyorlar, tek fark ilişkinin hangi tarafında olduğun. Bir Eğer User
bir sahiptir Profile
, ardından User
sınıfın ederdiniz has_one :profile
ve Profile
sı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.Profile
profiles
user_id
profile_id
users
Profile
User
İşte daha ayrıntılı bir açıklama.
Product belongs_to Shop
anlamına gelirproducts
shop_id
Yabancı anahtarın nerede oturduğu hakkında.
class Foo < AR:Base
end
belongs_to :bar
, foos tablosunun bir bar_id
sütunu vardırhas_one :bar
, çubuklar tablosunun bir foo_id
sütunu vardırEğer senin kavramsal seviyede, class A
bir var has_one
olan ilişkiyi class B
daha sonra class A
üstüdür class B
dolayısıyla senin class B
bir olacak belongs_to
olan ilişkisini class A
o çocuğu olduğu için class A
.
Her ikisi de 1-1 ilişkisini ifade eder. Aradaki fark çoğunlukla belongs_to
iliş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)
)
Account
ve User
genellikle bir Hesap birçok kullanıcısı olabilir durumdur çünkü bu örnekte talihsizliktir.
has_one
ve belongs_to
genellikle diğer ilgili modele işaret ettikleri anlamında aynıdır. belongs_to
bu modelin foreign_key
tanımlı olduğundan emin olun .
has_one
diğer model has_foreign
anahtarının tanımlandığından emin olur .
Daha spesifik olmak gerekirse, iki tarafı vardır relationship
, biri Owner
diğeri Belongings
. Keşke has_one
tanımlanır onun alabilirsiniz Belongings
ama olamıyorum Owner
dan belongings
. İzlemek için ait olan modelde de Owner
tanı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_to
daha iyi olduğu has_one
nedeniyle has_one
, zorunlu tutmak yabancı anahtar vardır model ve tabloya aşağıdaki sınırlamaları eklemek olurdu has_one
ilişki:
validates :foreign_key, presence: true, uniqueness: true