回答:
彼らは本質的に同じことをします、唯一の違いはあなたが関係のどちら側にいるかです。a User
がを持っている場合Profile
は、User
クラスhas_one :profile
内とProfile
クラス内にがありbelongs_to :user
ます。だれが他のオブジェクトを「持っている」かを判別するには、外部キーの場所を調べます。テーブルに列があるため、User
「がある」と言えます。ただし、テーブルで呼び出された列があった場合、aにはがあり、belongs_to / has_oneの場所が入れ替えられます。Profile
profiles
user_id
profile_id
users
Profile
User
詳細はこちらです。
Product belongs_to Shop
ことを意味しproducts
ますshop_id
それは外部キーがどこにあるかについてです。
class Foo < AR:Base
end
belongs_to :bar
、foosテーブルにはbar_id
列がありますhas_one :bar
、barsテーブルにはfoo_id
列がありますあなたの場合は概念レベルでは、class A
持っているhas_one
との関係class B
、その後をclass A
の親であるclass B
ので、あなたのclass B
持っているだろうbelongs_to
との関係をclass A
、それはの子であることからclass A
。
どちらも1-1の関係を表しています。違いは主に、belongs_to
関係を宣言するクラスのテーブルにある外部キーを配置する場所です。
class User < ActiveRecord::Base
# I reference an account.
belongs_to :account
end
class Account < ActiveRecord::Base
# One user references me.
has_one :user
end
これらのクラスのテーブルは次のようになります。
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
とUser
、それは多くの場合、アカウントは、多くのユーザーを持つことができる場合があるため、この例では残念なことです。
has_one
そしてbelongs_to
一般的に、それらは他の関連モデルを指すという意味で同じです。belongs_to
このモデルがforeign_key
定義されていることを確認してください。
has_one
他のモデルhas_foreign
キーが定義されていることを確認します。
より具体的には、には2つの側面があります。1つはでrelationship
、もう1つはOwner
ですBelongings
。場合にのみhas_one
定義されている私たちは、そのを得ることができますBelongings
が、取得することはできませんOwner
からbelongings
。を追跡するにOwner
はbelongs_to
、所属モデルでも定義する必要があります。
追加したいのは、次のモデルの関連付けがあるとします。
class Author < ApplicationRecord
has_many :books
end
上記の関連付けのみを作成すると、特定の著者のすべての本を入手できます。
@books = @author.books
しかし、特定の本については、対応する著者を入手できません。
@author = @book.author
上記のコードを機能させるには、次のようにBookモデルにも関連付けを追加する必要があります
class Book < ApplicationRecord
belongs_to :author
end
これにより、Bookモデルにメソッド 'author'が追加されます。
モードの詳細については、ガイドを参照してください