2009-03-18 10 views
22

has_manyの代わりに、has_and_belongs_to_manyの関連付けをレールに明示的に使用していますか?私はthesearticlesdescribingの違いと回避策を知っていますが、2006年からです。私が読んだことから、人々はhabtmが古くて不器用だと思っているようですが、必要なモデルはありません。Railsのhas_and_belongs_to_many

思考?

答えて

29

has_and_belongs_to_manyは、単純な多対多リレーションシップを意味します。

has_many:throughは、間接的な1対多リレーションシップ、またはプロパティとの多対多リレーションシップを意味します。

単純な多対多リレーションシップを探しているだけの場合は、has_and_belongs_to_manyを使用しない理由はありません。

例多対多の関係:

ユーザは、ゼロ以上のグループに属し、グループは、ゼロ以上のメンバー(ユーザー)を有しています。特性を有する

例多対多の関係:

ユーザは、ゼロ以上のグループに属し、グループはランクゼロ以上のメンバーを有します。

たとえば、アリスはグループAの管理者であり、モデレーターはグループBです。このプロパティは、結合テーブルに保持できます。

例間接一対多の関係:

カテゴリは、ゼロ以上のサブカテゴリーを有し、各サブカテゴリーは、0個以上の項目を有します。

したがって、カテゴリにはサブカテゴリによって0個以上のアイテムがあります。

は、これらのカテゴリ考えてみましょう:

食品→果物、野菜をなど、アップル、オレンジ、→
果物などにんじん、セロリ、→
野菜ので

食べ物→アップル、オレンジ、ニンジン、セロリなど

+2

再帰を理解するには、まず再帰を理解する必要があります。私はあなたの答えは、プロパティを持たない多対多の関係とプロパティとの多対多の関係に関して、より明確で実証的であると思います。 –

+3

例をいくつか追加しましょう。 –

+0

+1、それは実際に私を助けてくれました。 –

3

has_and_belongs_to_manyを使用すると、結合モデルを必要としない場合は何も問題はありません。私はちょうど最近のプロジェクトでそれを使ってきました。

+0

これを 'accept_nested_attribute_for'でどのように使うことができますか?ありがとうございます – hqt

3

私はHABTMを使用することはありません。これは、優雅さの心配がないからです。今、私が今ポイントを見ることができなくても、将来、関係にデータを追加したいと常に想像できるからです。怠け者であるため、私は、関係を再構築して列を追加するのではなく、単に列を結合に追加するだけでいいのです。

+7

?本当に? 「私はgotoを使っていない」のように決して好きではない? –

+0

私は、論理的にそれにデータを追加することが不可能な関係を思いつくことができたら、私はHABTMを選択するかもしれないと思います。さもなければ、私はhas_many:throughに行きます。 – srboisvert

3

このように考えています。

X----1 
    __/ 
/
Y----2 
    __/ 
/ 
Z----3 

(x軸> 1 Y-> 1,2 Z-> 2,3)

がHABTMの関係を使用してください:あなたはすでにあなたは多対多のモデルが必要であることを発見したと仮定すると、上記の私の(うまくいけばわかりやすい)写真の各行についての情報を格納する必要はない。

これらの行(リレーションシップ)に関する情報を格納する必要がある場合は、「スルー」を使用します。

人物[XYZ]がプロジェクト[123]を持っていると言っているが、プロジェクト1の人物Xについて何も言わない必要があると言っているだけなら、HABTMを使用してください。

人Xにプロジェクト1があり、特定の日付にのプロジェクトが割り当てられているとすると、突然その特定の関係に適していて、HMTを使いやすくなります。

+3

+1の甘い図表 – jbnunn

+1

ホホ、ありがとう!勝利のためのASCIIグラフィックス! – Jon

関連する問題