【问题标题】:Rails has_and_belongs_to_many is confusing me with fixtures and factoriesRails has_and_belongs_to_many 让我对固定装置和工厂感到困惑
【发布时间】:2009-06-12 01:03:26
【问题描述】:

一般的困惑
我有可以有 3 种流派的乐队。我在previous SO post 中读到,处理此问题的正确方法是几个步骤:

1) 在band.rb中

has_and_belongs_to_many :genres

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" }  
}

我得到一个“未知”的乐队专栏。我认为 rails 应该知道“收割者乐队”将指代乐队夹具中的乐队(当然同名)并会获取该 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 会为我处理所有脏活,但我确实想遵守规则。

【问题讨论】:

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


    【解决方案1】:
    1. 在两个方向上有和属于许多定义关系。如果您只需要查看乐队所属的流派,has_many 就可以了。如果您想知道哪些乐队是“放克”乐队,您可以使用 HABTM 来查找特定流派的乐队。
    2. 对于夹具,您现在可以在导轨中执行 HABTM,而无需为连接表创建单独的夹具。例如:

    在bands.yml中:

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

    在genres.yml中:

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

    【讨论】:

    • 感谢您的简单解释。但是,我收到“Mysql::Error: Unknown column 'bands' in 'field list': INSERT INTO genres (name, bands, id) VALUES ('Funk', 'The_Reaper_Band', 46)" 当我尝试播种时。 Rails 似乎不知道查看连接表……知道为什么会发生这种情况吗?
    • 嗯 - 您正在运行哪个版本的导轨?此功能是在 2.x 版本之一中添加的。所以当你尝试'rake fixtures:load'时你会收到这个错误?
    • 我正在寻找与连接表的has_many through: 关系的解决方案以及我不需要为连接表设置固定装置的信息,这让我很头疼,是无价!投票。
    猜你喜欢
    • 2012-05-21
    • 2012-11-25
    • 2019-06-23
    • 2014-07-08
    • 1970-01-01
    • 2017-02-28
    • 2021-09-05
    • 2016-07-29
    • 1970-01-01
    相关资源
    最近更新 更多