Was ist der Unterschied zwischen a belongs_to
und a has_one
?
Das Lesen des Ruby on Rails-Handbuchs hat mir nicht geholfen.
ruby-on-rails
activerecord
Blankman
quelle
quelle
Antworten:
Sie machen im Wesentlichen dasselbe, der einzige Unterschied ist, auf welcher Seite der Beziehung Sie sich befinden. Wenn a ein
User
hatProfile
, dann in derUser
Klasse, die Sie haben würden,has_one :profile
und in derProfile
Klasse, die Sie haben würdenbelongs_to :user
. Um festzustellen, wer das andere Objekt "hat", überprüfen Sie, wo sich der Fremdschlüssel befindet. Wir können sagen, dass einUser
"hat" ein,Profile
weil dieprofiles
Tabelle eineuser_id
Spalte hat. Wenn jedoch eine Spalteprofile_id
in derusers
Tabelle aufgerufen würde, würden wir sagen, dass a eineProfile
hatUser
und die Positionen "Gehört zu / Hat_one" vertauscht würden.Hier ist eine detailliertere Erklärung.
quelle
Product belongs_to Shop
products
shop_id
Es geht darum, wo sich der Fremdschlüssel befindet.
belongs_to :bar
, dann hat der foos Tisch einebar_id
Spaltehas_one :bar
, dann hat die Balkentabelle einefoo_id
SpalteAuf der konzeptionellen Ebene, wenn Ihr
class A
eine hathas_one
Beziehung mitclass B
dannclass A
ist das Elternteilclass B
damit Ihrclass B
eine habenbelongs_to
Beziehung ,class A
da es das Kindclass A
.Beide drücken eine 1-1 Beziehung aus. Der Unterschied besteht hauptsächlich darin, wo der Fremdschlüssel platziert werden soll, der für die Klasse, die die
belongs_to
Beziehung deklariert, auf dem Tisch liegt .Die Tabellen für diese Klassen könnten ungefähr so aussehen:
quelle
Account
undUser
in diesem Beispiel ist unglücklich, da ein Konto häufig viele Benutzer haben kann.has_one
undbelongs_to
sind im Allgemeinen in dem Sinne gleich, dass sie auf das andere verwandte Modell verweisen.belongs_to
Stellen Sie sicher, dass dieses Modell dasforeign_key
definierte hat.has_one
stellt sicher, dass der andere Modellschlüsselhas_foreign
definiert ist.Genauer gesagt gibt es zwei Seiten: die
relationship
eine ist dieOwner
andere und die andereBelongings
. Wenn nurhas_one
definiert ist, können wir seine bekommen,Belongings
aber nicht dieOwner
von derbelongings
. Um das zu verfolgenOwner
, müssen wir dasbelongs_to
auch im zugehörigen Modell definieren.quelle
Eine zusätzliche Sache, die ich hinzufügen möchte, ist: Angenommen, wir haben folgende Modellzuordnung
class Author < ApplicationRecord has_many :books end
Wenn wir nur die obige Assoziation schreiben, können wir alle Bücher eines bestimmten Autors erhalten von,
Aber für ein bestimmtes Buch können wir den entsprechenden Autor nicht von bekommen,
Damit der obige Code funktioniert, müssen wir auch dem Buchmodell eine Zuordnung hinzufügen
Dadurch wird dem Buchmodell die Methode 'author' hinzugefügt.
Einzelheiten zum Modus finden Sie in den Anleitungen
quelle
Aus Sicht der Einfachheit
belongs_to
ist dies besser alshas_one
weilhas_one
Sie dem Modell und der Tabelle, die den Fremdschlüssel zum Erzwingen derhas_one
Beziehung enthalten , die folgenden Einschränkungen hinzufügen müssten :validates :foreign_key, presence: true, uniqueness: true
quelle