Ton*_*ony 7 ruby-on-rails fixtures has-and-belongs-to-many factories
一般混乱
我有乐队可以有3种类型.我在之前的SO文章中读到,处理这个问题的正确方法是几个步骤:
1)在band.rb
has_and_belongs_to_many :genres
Run Code Online (Sandbox Code Playgroud)
2)创建band_genres连接表
即使阅读了文档后,我对HABTM的实际含义感到有些困惑.我想我通常会认为"一个乐队有很多类型",没有并且属于很多.因此,对此的快速DUMBED解释将是伟大的.
与夹具混淆
另外,当我为band_genres做夹具时,我有
{
"The Reaper Band and Funk": { "band": "The Reaper Band", "genre": "Funk" },
"The Reaper Band and Rock": { "band": "The Reaper Band", "genre": "Rock" }
}
Run Code Online (Sandbox Code Playgroud)
我得到了一个"未知"的乐队专栏.我认为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
Run Code Online (Sandbox Code Playgroud)
我在这里意识到我可能需要一个硬编码的genre_id.但是为什么rails不看那个并说"哦,他想把id = 2的类型添加到band_genres表".
我不期待铁路为我处理所有肮脏的工作,但我确实想按照规则行事.
小智 21
在bands.yml:
reaper_band:
name: The Reaper Band
genres: funk, rock
Run Code Online (Sandbox Code Playgroud)
在genres.yml:
funk:
name: Funk
bands: reaper_band
rock:
name: Rock
bands: reaper_band
Run Code Online (Sandbox Code Playgroud)