Jaka jest różnica między a belongs_to
i ahas_one
?
Czytanie przewodnika po Ruby on Rails nie pomogło mi.
ruby-on-rails
activerecord
Blankman
źródło
źródło
Odpowiedzi:
Zasadniczo robią to samo, jedyną różnicą jest to, po której stronie związku jesteś. Jeśli a
User
maProfile
, to wUser
klasie, którą byś miał,has_one :profile
iwProfile
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 aUser
„ma” a,Profile
ponieważprofiles
tabela mauser_id
kolumnę. Gdyby jednakprofile_id
wusers
tabeli była wywołana kolumna , powiedzielibyśmy, że aProfile
ma aUser
, a lokalizacje należą do / has_one zostałyby zamienione.tutaj jest bardziej szczegółowe wyjaśnienie.
źródło
Product belongs_to Shop
oznacza to, żeproducts
tabela mashop_id
kolumnęChodzi o to, gdzie znajduje się klucz obcy.
belongs_to :bar
, to tabela foos mabar_id
kolumnęhas_one :bar
, to tabela słupków mafoo_id
kolumnęNa poziomie koncepcyjnym, jeśli
class A
mahas_one
związek zclass B
czymclass A
jest rodzicemclass B
stąd twójclass 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.Tabele dla tych zajęć mogłyby wyglądać mniej więcej tak:
źródło
Account
iUser
w tym przykładzie jest niefortunne, ponieważ często zdarza się, że konto może mieć wielu użytkowników.has_one
ibelongs_to
ogólnie są takie same w tym sensie, że wskazują na inny powiązany model.belongs_to
upewnij się, że ten model maforeign_key
zdefiniowane.has_one
upewnia się, żehas_foreign
zdefiniowano inny klucz modelu .Mówiąc dokładniej, istnieją dwie strony
relationship
, jedna jestOwner
druga, a druga jestBelongings
. Jeśli tylkohas_one
jest zdefiniowane, możemy uzyskać jego,Belongings
ale nie możemy uzyskaćOwner
zbelongings
. Aby prześledzićOwner
, musimy zdefiniowaćbelongs_to
również w przynależnym modelu.źródło
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,
Ale w przypadku konkretnej książki nie możemy znaleźć odpowiedniego autora,
aby powyższy kod działał, musimy dodać skojarzenie również do modelu Book, w ten sposób
Spowoduje to dodanie metody „autor” do modelu książki.
Szczegółowe informacje na temat trybu można znaleźć w przewodnikach
źródło
Z prostego punktu widzenia
belongs_to
jest lepsze niżhas_one
ponieważ w programiehas_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
źródło