Rails has_and_belongs_to_many让我对固定装置和工厂感到困惑

时间:2009-06-12 01:03:26

标签: ruby-on-rails fixtures has-and-belongs-to-many factories

一般混乱
我有乐队可以有3种类型。我在previous SO post中读到,处理这个问题的正确方法有两个步骤:

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

我在这里意识到我可能需要一个硬编码的genre_id。但是为什么rails不看那个并说“哦,他想把id = 2的类型添加到band_genres表”。

我不期待铁路为我处理所有肮脏的工作,但我确实想遵守规则。

1 个答案:

答案 0 :(得分:21)

  1. 拥有并且属于许多人定义了两个方向的关系。如果您只需要查看乐队属于哪种类型,has_many就可以了。如果您想知道哪些乐队是“funk”,您可以使用HABTM来查找给定流派的乐队。
  2. 对于灯具,在轨道中,您现在可以执行HABTM而无需为连接表创建单独的灯具。例如:
  3. in bands.yml:

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

    in genres.yml:

    funk:
      name: Funk
      bands: reaper_band
    
    rock:
      name: Rock
      bands: reaper_band