belongs_toとhas_oneの違いは何ですか?


回答:


241

彼らは本質的に同じことをします、唯一の違いはあなたが関係のどちら側にいるかです。a Userがを持っている場合Profileは、Userクラスhas_one :profile内とProfileクラス内にがありbelongs_to :userます。だれが他のオブジェクトを「持っている」かを判別するには、外部キーの場所を調べます。テーブルに列があるため、User「がある」と言えます。ただし、テーブルで呼び出された列があった場合、aにはがあり、belongs_to / has_oneの場所が入れ替えられます。Profileprofilesuser_idprofile_idusersProfileUser

詳細はこちらです。


okは理にかなっています、has_aはプロパティですが、属しているのはリレーションシップです。
ブランクマン

48
つまり、本当に短いと言えば、テーブルに列があるProduct belongs_to Shopことを意味しproductsますshop_id
Yo Ludke

@ryeguy、これが自己結合関係である場合はどうですか?
Arian Faurtosh

49

それは外部キーがどこにあるかについてです。

class Foo < AR:Base
end
  • fooの場合belongs_to :bar、foosテーブルにはbar_id列があります
  • fooの場合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)
)

それは、2年前に受け入れられた回答がすでに述べているものとほとんど同じです。
matthias krull 2012年

11
これはかなり良い答えです。
typeoneerror

使用AccountUser、それは多くの場合、アカウントは、多くのユーザーを持つことができる場合があるため、この例では残念なことです。
karmakaze

5

has_oneそしてbelongs_to一般的に、それらは他の関連モデルを指すという意味で同じです。belongs_toこのモデルがforeign_key定義されていることを確認してください。 has_one他のモデルhas_foreignキーが定義されていることを確認します。

より具体的には、には2つの側面があります。1つはでrelationship、もう1つはOwnerですBelongings。場合にのみhas_one定義されている私たちは、そのを得ることができますBelongingsが、取得することはできませんOwnerからbelongings。を追跡するにOwnerbelongs_to、所属モデルでも定義する必要があります。


3

追加したいのは、次のモデルの関連付けがあるとします。

class Author < ApplicationRecord has_many :books end

上記の関連付けのみを作成すると、特定の著者のすべての本を入手できます。

@books = @author.books

しかし、特定の本については、対応する著者を入手できません。

@author = @book.author

上記のコードを機能させるには、次のようにBookモデルにも関連付けを追加する必要があります

class Book < ApplicationRecord
  belongs_to :author
end

これにより、Bookモデルにメソッド 'author'が追加されます。
モードの詳細については、ガイドを参照してください


0

単純化の観点からは 、の場合belongs_toよりも優れています。関係を適用するには、外部キーを持つモデルとテーブルに次の制約を追加する必要があります。has_onehas_onehas_one

  • validates :foreign_key, presence: true, uniqueness: true
  • 外部キーにデータベースの一意のインデックスを追加します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.