web-dev-qa-db-ja.com

Rails:belongs_toとhas_one

Railsアソシエーションに関する初心者の質問です。

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

コンテンツbelongs_toContentTemplate。戻って、私が問題をどのように説明したかを見てください。それが機能することがわかります。 [belongs_to]を使用すると、テーブルは外部キーの責任を引き受けます。したがって、コンテンツにはcontent_template_idがあります。そして、ContentTemplateは何も必要としません。私はそれを自由に指摘することができます。完了。

バグbelongs_toステータスの方が適切です(バグは外部キーを取る必要があるため)。意味的には、彼の例は理にかなっていますが、私の例は何も意味がありません。これはRailsの癖ですが、この状況では奇妙に見えますか、それとも私は何かを理解していない/間違っているのですか?

35
Matt Briggs

はい、Railsで少し奇妙に見えるシナリオを見つけたと思います。 「ステータス」をバグが属するカテゴリの一種と見なすと便利な場合があると思います。その観点からすると、それは理にかなっています。

19
Chuck
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
9
Willem Obst

バグとステータスの関係について正確に説明していませんが、次のいずれかに関心があると思います。

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

どちらの場合も、ステータスには外部キーが含まれます。 2番目のケースでは、1対1の関係が実際には非対称であるため、表現が少し奇妙です(片側にのみFKがあるはずです)。

2
Adam Byrtek

Statusが単なるルックアップ/ Key-Valueテーブルである場合、StatusとBugの間に habtm (_has_and_belongs_to_many_)の関係が必要なようです。 habtmを使用すると、最終的には_bugs_statuses_結合テーブルになります。このテーブルには_bug_id_列と_status_id_列、およびバグとステータスのテーブルがあります。

0
rnicholson