2009-05-14 65 views
57

私はRoRでhas_oneの関係を理解し​​ようとしています。私はちょうどCellモデルにhas_one :person代わりのbelongs_to :personを使用することはできRailsのhas_oneとbelongs_toの違いは?

class Person < ActiveRecord::Base 
    has_one :cell 
end 

class Cell < ActiveRecord::Base 
    belongs_to :person 
end 

PersonCell -

はのは、私は2つのモデルがあるとしましょうか?

同じではありませんか?

+1

1つの良い[ブログはこちら](http://requiremind.com/differences-between-has-one-and-belongs-to-in-ruby-on-rails/)同じ! –

+0

上記のコードは間違っていますが、 'has_one:cell'と' belongs_to:person'でなければなりません**コロンと次の単語の間のスペースでなければなりません。 – Josh

答えて

142

いいえ、これらは互換性がなく、実際の違いがあります。

belongs_toは、このクラスの外部キーがテーブルにあることを意味します。したがってbelongs_toは、外部キーを保持するクラスにのみ入ることができます。

has_oneは、このクラスを参照する別のテーブルに外部キーが存在することを意味します。したがって、has_oneは、別のテーブルの列によって参照されるクラスにのみ入ることができます。

だから、これは間違っている:

class Person < ActiveRecord::Base 
    has_one :cell # the cell table has a person_id 
end 

class Cell < ActiveRecord::Base 
    has_one :person # the person table has a cell_id 
end 

は、これは次のとおりです。双方向関連については

class Person < ActiveRecord::Base 
    belongs_to :cell # the person table has a cell_id 
end 

class Cell < ActiveRecord::Base 
    belongs_to :person # the cell table has a person_id 
end 

、あなたはそれぞれのいずれかが必要、と彼らは右のクラスに行かなければなりません。片方向の関連付けであっても、どちらを使うかは重要です。

+0

良い答え。あなたの答えを見る私は半分の質問を読むことを実感します。申し訳ありませんが、あなたが飛び込んだことをうれしく思います。+ 1 –

+5

私はこれを十億回見なければなりませんでした。私は彼らがどこに行くのかをより明確にするために、名前を少しずつ考えていたといいと思う。 –

+18

偉大な、今私は2つの間違った答えを知っている。それを表示する "正しい"方法を示す方が良いでしょう。言ってるだけ'。 – y0mbo

7

両方を使用すると、PersonモデルとCellモデルの両方から情報を取得できます。

@cell.person.whatever_info and @person.cell.whatever_info. 
10

「belongs_to」を追加すると、双方向の関連付けが得られます。つまり、あなたは細胞から人を、人から細胞を得ることができます。

実際の違いはありません。どちらのアプローチも(「belongs_to」の有無にかかわらず)同じデータベーススキーマ(セルデータベーステーブルのperson_idフィールド)を使用します。

要約:モデル間の双方向の関連付けを必要としない限り、「belongs_to」を追加しないでください。

+0

私が今日読んだベストラインは:「belongs_to」を追加すると、双方向の関連性が得られます。つまり、セルと人物のセルを取得できます。 +1 –

関連する問題