Rails の has_and_belongs_to_many がフィクスチャとファクトリーで混乱している
-
13-09-2019 - |
質問
一般的な混乱
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」が結合テーブルの 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
ここで、おそらくハードコードされた ジャンル ID が必要になることに気づきました。しかし、なぜ Rails はそれを見て、「ああ、彼は id=2 のジャンルを Band_genres テーブルに追加したいのだ」と言わないのでしょうか。
Rails が面倒な作業をすべてやってくれるとは期待していませんが、ルールに従ってプレイしたいと思っています。
解決
- 「持っている」と「属している」は、双方向の関係を定義します。バンドがどのジャンルに属しているかだけを確認する必要がある場合は、has_many で十分です。どのバンドが「ファンク」であるかを知りたい場合は、HABTM を使用して、特定のジャンルのバンドを検索できます。
- フィクスチャについては、Rails で結合テーブル用に別のフィクスチャを作成せずに HABTM を実行できるようになりました。例えば:
Bands.yml 内:
reaper_band:
name: The Reaper Band
genres: funk, rock
ジャンル.yml 内:
funk:
name: Funk
bands: reaper_band
rock:
name: Rock
bands: reaper_band
所属していません StackOverflow