22

has_many :through の代わりに、レールで has_and_belongs_to_many アソシエーションを使用することに明らかに問題がありますか? 相違点と回避策を説明しているこれらの 記事 は知っていますが、それらは 2006 年のものです。私が SO で読んだことから、habtm は古くて扱いにくいと思われているようですが、単純な多対多が参加するとどうなるでしょうか。モデルは必要ありません。お探しのモデルはありますか?

考え?

4

4 に答える 4

29

has_and_belongs_to_many は、単純な多対多の関係を対象としています。

一方、 has_many :through は、間接的な 1 対多の関係、またはプロパティとの多対多の関係を意味します。

単純な多対多の関係だけを探しているのであれば、has_and_belongs_to_many を使用しない理由は見当たりません。

多対多の関係の例:

ユーザーは 0 個以上のグループに属しており、グループには 0 個以上のメンバー (ユーザー) がいます。

プロパティとの多対多の関係の例:

ユーザーは 0 個以上のグループに属しており、グループにはランクを持つ 0 個以上のメンバーがいます。

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

間接的な 1 対多の関係の例:

カテゴリには 0 個以上のサブカテゴリがあり、各サブカテゴリには 0 個以上のアイテムがあります。

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

次のカテゴリを検討してください。

食べ物 → 果物、野菜
果物 → りんご、みかんなど
野菜 → にんじん、セロリなど

したがって:

食べ物 → りんご、みかん、にんじん、セロリなど

于 2009-03-18T13:22:33.193 に答える
3

エレガンスが気になるからではなく、今は要点がわからなくても、将来は関係にデータを追加したいと思っているので、HABTMを使うことはありません。怠惰なので、関係を作り直してから列を追加するのではなく、単に列を結合に追加できるようにしたいと思います。

于 2009-03-18T20:54:14.200 に答える
3

このように考えています。多対多モデルが必要であることがすでにわかっていると仮定します。

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

(x->1 y->1,2 z->2,3)

上の私の(うまくいけば認識できる)写真の各行に関する情報を保存する必要がない場合は、HABTM 関係を使用してください。

これらの行 (関係) に関する情報を保存する必要がある場合は、「スルー」を使用します。

したがって、人 [XYZ] がプロジェクト [123] を持っており、それに属していると言っているだけで、プロジェクト 1 の人 X について何も言う必要がない場合は、HABTM を使用します。

人 X がプロジェクト 1 を持っていて、特定の日付にそのプロジェクトを割り当てられたと言いたい場合、あなたは突然その特定の関係に適切な関係を持ち、HMT をより適切に使用できます。

于 2011-05-25T03:30:17.100 に答える
3

has_and_belongs_to_many結合モデルが必要ない場合は、使用しても問題ありません。最近のプロジェクトで自分で使用しました。

于 2009-03-18T13:36:48.900 に答える