Rails has_and_belongs_to_many 让我对装置和工厂感到困惑
-
13-09-2019 - |
题
普遍的混乱
我的乐队可以有 3 种风格。我读过一个 以前的SO帖子 处理这个问题的正确方法是几个步骤:
1) 带内.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。但为什么 Rails 不看看并说“哦,他想将 id=2 的流派添加到 band_genres 表中”。
我并不期望 Rails 为我处理所有肮脏的工作,但我确实想遵守规则。
解决方案
- 拥有和属于许多定义了双向关系。如果你只需要查看乐队属于什么流派,has_many 就可以了。如果您想知道哪些乐队是“放克”乐队,您可以使用 HABTM 来查找给定流派的乐队。
- 对于固定装置,您现在可以在导轨中执行 HABTM,而无需为连接表创建单独的固定装置。例如:
在 band.yml 中:
reaper_band:
name: The Reaper Band
genres: funk, rock
在流派.yml 中:
funk:
name: Funk
bands: reaper_band
rock:
name: Rock
bands: reaper_band
不隶属于 StackOverflow