Odpowiedzi:
Zasadniczo robią to samo, jedyną różnicą jest to, po której stronie związku jesteś. Jeśli a User
ma Profile
, to w User
klasie, którą byś miał, has_one :profile
iw Profile
klasie, którą miałbyś belongs_to :user
. Aby określić, kto „ma” inny obiekt, spójrz, gdzie jest klucz obcy. Można powiedzieć, że a User
„ma” a, Profile
ponieważ profiles
tabela ma user_id
kolumnę. Gdyby jednak profile_id
w users
tabeli była wywołana kolumna , powiedzielibyśmy, że a Profile
ma a User
, a lokalizacje należą do / has_one zostałyby zamienione.
tutaj jest bardziej szczegółowe wyjaśnienie.
Product belongs_to Shop
oznacza to, że products
tabela ma shop_id
kolumnę
Chodzi o to, gdzie znajduje się klucz obcy.
class Foo < AR:Base
end
belongs_to :bar
, to tabela foos ma bar_id
kolumnęhas_one :bar
, to tabela słupków mafoo_id
kolumnęNa poziomie koncepcyjnym, jeśli class A
ma has_one
związek z class B
czym class A
jest rodzicem class B
stąd twój class B
będzie mieć belongs_to
związek zclass A
ponieważ jest dzieckiemclass A
.
Obie wyrażają zależność 1-1. Różnica polega głównie na tym, gdzie umieścić klucz obcy, który trafia na tabelę dla klasy deklarującej belongs_to
związek.
class User < ActiveRecord::Base
# I reference an account.
belongs_to :account
end
class Account < ActiveRecord::Base
# One user references me.
has_one :user
end
Tabele dla tych zajęć mogłyby wyglądać mniej więcej tak:
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
i User
w tym przykładzie jest niefortunne, ponieważ często zdarza się, że konto może mieć wielu użytkowników.
has_one
i belongs_to
ogólnie są takie same w tym sensie, że wskazują na inny powiązany model. belongs_to
upewnij się, że ten model ma foreign_key
zdefiniowane.
has_one
upewnia się, że has_foreign
zdefiniowano inny klucz modelu .
Mówiąc dokładniej, istnieją dwie strony relationship
, jedna jest Owner
druga, a druga jest Belongings
. Jeśli tylko has_one
jest zdefiniowane, możemy uzyskać jego, Belongings
ale nie możemy uzyskać Owner
z belongings
. Aby prześledzić Owner
, musimy zdefiniować belongs_to
również w przynależnym modelu.
Jedną dodatkową rzeczą, którą chcę dodać, jest: Załóżmy, że mamy następujące skojarzenia modeli
class Author < ApplicationRecord
has_many :books
end
jeśli napiszemy tylko powyższe skojarzenie, możemy otrzymać wszystkie książki danego autora przez,
@books = @author.books
Ale w przypadku konkretnej książki nie możemy znaleźć odpowiedniego autora,
@author = @book.author
aby powyższy kod działał, musimy dodać skojarzenie również do modelu Book, w ten sposób
class Book < ApplicationRecord
belongs_to :author
end
Spowoduje to dodanie metody „autor” do modelu książki.
Szczegółowe informacje na temat trybu można znaleźć w przewodnikach
Z prostego punktu widzenia belongs_to
jest lepsze niż has_one
ponieważ w programie has_one
należałoby dodać następujące ograniczenia do modelu i tabeli, które mają klucz obcy, aby wymusić has_one
relację:
validates :foreign_key, presence: true, uniqueness: true