Odpowiedzi:
Zasadniczo robią to samo, jedyną różnicą jest to, po której stronie związku jesteś. Jeśli a Userma Profile, to w Userklasie, którą byś miał, has_one :profileiw Profileklasie, 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, Profileponieważ profilestabela ma user_idkolumnę. Gdyby jednak profile_idw userstabeli była wywołana kolumna , powiedzielibyśmy, że a Profilema a User, a lokalizacje należą do / has_one zostałyby zamienione.
tutaj jest bardziej szczegółowe wyjaśnienie.
Product belongs_to Shopoznacza to, że productstabela ma shop_idkolumnę
Chodzi o to, gdzie znajduje się klucz obcy.
class Foo < AR:Base
end
belongs_to :bar , to tabela foos ma bar_idkolumnęhas_one :bar, to tabela słupków mafoo_id kolumnęNa poziomie koncepcyjnym, jeśli class Ama has_onezwiązek z class Bczym class Ajest rodzicem class Bstąd twój class Bbędzie mieć belongs_tozwią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_tozwią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)
)
Accounti Userw tym przykładzie jest niefortunne, ponieważ często zdarza się, że konto może mieć wielu użytkowników.
has_onei belongs_toogólnie są takie same w tym sensie, że wskazują na inny powiązany model. belongs_toupewnij się, że ten model ma foreign_keyzdefiniowane.
has_oneupewnia się, że has_foreignzdefiniowano inny klucz modelu .
Mówiąc dokładniej, istnieją dwie strony relationship, jedna jest Ownerdruga, a druga jest Belongings. Jeśli tylko has_onejest zdefiniowane, możemy uzyskać jego, Belongingsale nie możemy uzyskać Ownerz belongings. Aby prześledzić Owner, musimy zdefiniować belongs_toró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_tojest lepsze niż has_oneponieważ w programie has_onenależałoby dodać następujące ograniczenia do modelu i tabeli, które mają klucz obcy, aby wymusić has_onerelację:
validates :foreign_key, presence: true, uniqueness: true