回答:
彼らは本質的に同じことをします、唯一の違いはあなたが関係のどちら側にいるかです。a Userがを持っている場合Profileは、Userクラスhas_one :profile内とProfileクラス内にがありbelongs_to :userます。だれが他のオブジェクトを「持っている」かを判別するには、外部キーの場所を調べます。テーブルに列があるため、User「がある」と言えます。ただし、テーブルで呼び出された列があった場合、aにはがあり、belongs_to / has_oneの場所が入れ替えられます。Profileprofilesuser_idprofile_idusersProfileUser
詳細はこちらです。
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'が追加されます。
モードの詳細については、ガイドを参照してください