7

一般的な混乱
私は 3 つのジャンルを持つことができるバンドを持っています。以前の SO 投稿で、これを処理する適切な方法はいくつかの手順であると読みました。

1) band.rb内

has_and_belongs_to_many :genres

2) band_genres 結合テーブルを作成する

ドキュメントを読んだ後でも、HABTM が実際に何を意味するのかについて少し混乱しています。普通は「バンドってジャンルが多い」と思ってしまうのであって、複数を持っているわけでも所属しているわけでもありません。したがって、それについての簡単な説明は素晴らしいでしょう。

備品との混同

また、band_genres のフィクスチャを実行するときに、

{ 
  "The Reaper Band and Funk": { "band": "The Reaper Band", "genre": "Funk" },
  "The Reaper Band and Rock": { "band": "The Reaper Band", "genre": "Rock" }  
}

そして、「不明な」バンド列が表示されます。Railsは、「The Reaper Band」がバンドフィクスチャ(もちろん同じ名前)のバンドを参照し、そのIDを取得し、このフィクスチャの「バンド」が結合テーブルのband_idを参照することを知っているはずだと思いました. ハードコードされた数字よりも、フィクスチャがこのように見えることを望みます。

工場との混同

工場でバンドを作成するときに、ジャンルを割り当てたい:

Factory.define :band do |f|
  f.sequence(:name) { |n| "Band#{n}" }
  f.mailing_lists { |mailing_lists| [mailing_lists.association(:mailing_list)] }
  f.genres 2
end

ここで、おそらくハードコーディングされたgenre_idが必要になることに気づきました。しかし、レールはそれを見て、「ああ、id=2 のジャンルを band_genres テーブルに追加したい」と言わないのはなぜですか。

Railsがすべての面倒な作業を処理してくれるとは思っていませんが、ルールを守りたいと思っています。

4

1 に答える 1

21
  1. 多くの人が持っており、所属していると、両方向の関係が定義されます。バンドがどのジャンルに属しているかを確認するだけでよい場合は、has_manyで問題ありません。どのバンドが「ファンク」であるかを知りたい場合は、HABTMを使用して、特定のジャンルのバンドを検索できます。
  2. フィクスチャの場合、レールでは、結合テーブル用に個別のフィクスチャを作成せずにHABTMを実行できるようになりました。例えば:

band.ymlで:

reaper_band:
  name: The Reaper Band
  genres: funk, rock

genres.yml:

funk:
  name: Funk
  bands: reaper_band

rock:
  name: Rock
  bands: reaper_band
于 2009-06-12T19:57:03.523 に答える