Antworten:
Sie machen im Wesentlichen dasselbe, der einzige Unterschied ist, auf welcher Seite der Beziehung Sie sich befinden. Wenn a ein User
hat Profile
, dann in der User
Klasse, die Sie haben würden, has_one :profile
und in der Profile
Klasse, die Sie haben würden belongs_to :user
. Um festzustellen, wer das andere Objekt "hat", überprüfen Sie, wo sich der Fremdschlüssel befindet. Wir können sagen, dass ein User
"hat" ein, Profile
weil die profiles
Tabelle eine user_id
Spalte hat. Wenn jedoch eine Spalte profile_id
in der users
Tabelle aufgerufen würde, würden wir sagen, dass a eine Profile
hat User
und die Positionen "Gehört zu / Hat_one" vertauscht würden.
Hier ist eine detailliertere Erklärung.
Product belongs_to Shop
products
shop_id
Es geht darum, wo sich der Fremdschlüssel befindet.
class Foo < AR:Base
end
belongs_to :bar
, dann hat der foos Tisch einebar_id
Spaltehas_one :bar
, dann hat die Balkentabelle eine foo_id
SpalteAuf der konzeptionellen Ebene, wenn Ihr class A
eine hat has_one
Beziehung mit class B
dann class A
ist das Elternteil class B
damit Ihr class B
eine haben belongs_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 .
class User < ActiveRecord::Base
# I reference an account.
belongs_to :account
end
class Account < ActiveRecord::Base
# One user references me.
has_one :user
end
Die Tabellen für diese Klassen könnten ungefähr so aussehen:
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
und User
in diesem Beispiel ist unglücklich, da ein Konto häufig viele Benutzer haben kann.
has_one
und belongs_to
sind im Allgemeinen in dem Sinne gleich, dass sie auf das andere verwandte Modell verweisen. belongs_to
Stellen Sie sicher, dass dieses Modell das foreign_key
definierte hat.
has_one
stellt sicher, dass der andere Modellschlüssel has_foreign
definiert ist.
Genauer gesagt gibt es zwei Seiten: die relationship
eine ist die Owner
andere und die andere Belongings
. Wenn nur has_one
definiert ist, können wir seine bekommen, Belongings
aber nicht die Owner
von der belongings
. Um das zu verfolgen Owner
, müssen wir das belongs_to
auch im zugehörigen Modell definieren.
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,
@books = @author.books
Aber für ein bestimmtes Buch können wir den entsprechenden Autor nicht von bekommen,
@author = @book.author
Damit der obige Code funktioniert, müssen wir auch dem Buchmodell eine Zuordnung hinzufügen
class Book < ApplicationRecord
belongs_to :author
end
Dadurch wird dem Buchmodell die Methode 'author' hinzugefügt.
Einzelheiten zum Modus finden Sie in den Anleitungen
Aus Sicht der Einfachheit belongs_to
ist dies besser als has_one
weil has_one
Sie dem Modell und der Tabelle, die den Fremdschlüssel zum Erzwingen der has_one
Beziehung enthalten , die folgenden Einschränkungen hinzufügen müssten :
validates :foreign_key, presence: true, uniqueness: true