2009-05-22 2 views
35

レール関連の初心者の質問。Rails:belongs_to vs has_one

私はバグモデルとステータスモデルを持っています。ステータスは、基本的にはキー/値ペアテーブルです。利用可能な選択肢のうち、私はバグhas_oneステータスが最も理にかなっていると思います。しかし、this

コンテンツbelongs_to ContentTemplate。 に戻って、私が 問題をどのように記述したかを見てください。 belongs_toの場合、テーブルは外部キーに対する の責任を受け入れます。したがって、 コンテンツにcontent_template_idがあります。そして ContentTemplateには何も必要ありません。 私は自由にそれを指すことができます。完了しました。

Bug belongs_toステータスがより適切です(Bugは外部キーを取得する必要があるため)。意味的には、彼の例は理にかなっていますが、私は誰もしません。これはちょうど奇妙に見えるこの状況のレールの奇妙なものか、何かを理解していない/間違っているのですか?

答えて

18

はい、私はちょうどあなたがRailsでちょっと変わったシナリオを見つけたと思います。私は、バグが属している種類のものとして「状態」を見ることは有益かもしれないと思います。その光の中では意味があります。

+3

私はそれがうまくいかないレールが意味的にどのように機能するのかを証明するものだと思っています。この状況に当たったとき、私は「間違っているはずです」のようなものです –

0

ステータスがルックアップ/キー値テーブルの場合は、ステータスとバグの間にhabtmhas_and_belongs_to_many)の関係が必要なように思えます。 habtmを使用すると、bugs_statusesの結合表(bug_idstatus_id列)がバグとステータス表とともに表示されます。

+0

これは多対多リレーションシップ用です。これはそうではありません。これは多対1です。私の質問は基本的に、その関係の言葉遣いは、多対1ではなく、それを扱うよりエレガントな方法がある場合にのみ意味があるということです。 –

+0

。私は、 "バグ"とその "ステータス"についての私の典型的な考え方は、バグが複数のステータス(例えば "worksforme"と "open")である可能性があること、あるいはバグのステータスの履歴を保持したいことかもしれないということです。 – rnicholson

9
TABLE: 
    Bug 
    id integer 
    desc string 
    status_id integer fk 

    Status 
    id integer 
    desc string 

RAILS MODEL: 
    Bug 
    belongs_to :status 

    Status 
    has_many :bugs 
+2

ステータスには多くのバグがある可能性があるため、バグには外部キーが使用されますが、バグには一度にステータスが1つしかありません。 – Chuck

+0

あなたの新しい解決策は、私たちが状況をどのように考えているかですが、うまくいかないでしょう。 bug.statusを実行すると、存在しないstatusのbug_id列が検索されます。 has_oneまたはhas_manyは、「持っていた」クラスのbelongs_toによって照合される必要があります。 – Chuck

+0

どのように変更しますか?自分の答えを自分のものにコピーして、好きなだけ変更してください。私はちょうどあなたがモデルがどのように見えるべきだと思うか知りたいのは興味があります。 –

2

あなたが取得したいと思いバグとステータスとの間の関係の種類を正確に説明していませんでしたが、私はあなたが以下のいずれかに興味があると仮定します。

  • 一対多:この中に場合は、バグクラスのhas_manyとステータスクラスのbelongs_to
  • 一対一があるはず。この場合にはステータスクラスでバグクラスのhas_onebelongs_toがあるはずです。

どちらの場合も、ステータスには外部キーが含まれています。後者の場合、1対1の関係が実際に非対称であるという事実のために、文言はちょっと奇妙です(片面のみにFKがあるはずです)。

+1

問題は概念的にも、適切な実装。概念的には、*多くのバグに属していると考えられますが、Railsは多くのバグを持つステータスとしてしか表現できません。 – Chuck

+0

@chuck:それはかなりです。 1対多対対多対論理的にはほぼ同等ですが、概念的には違いがあります –