参考Rails夹具中的多对多种子数据

时间:2011-08-02 15:30:09

标签: ruby-on-rails fixtures

我正在为库存系统开发Rails 2.3.5项目。主要对象是Item,其中包含StateZipcode等关联对象。它还具有与Location的多对多关联(HABTM);因此,Item可以包含零个,一个或多个Locations

我在db/seeds.rb中使用种子数据来加载StateZipcodeLocation数据,因为该数据对于此项目的所有实例都是相同的。< / p>

我想为Item创建一个夹具来帮助我进行单元测试。这就是我到目前为止所做的:

# items.yml
widget1:
  state_id:   <%= State.find_by_name('Utah').id %> 
  zipcode_id: <%= Zipcode.find_by_name('00000').id %>
  locations_id: <%= Location.find_by_name('123 Main Street').id %>

state_idzipcode_id正常工作。我的问题是locations_id行。我不知道如何在fixture文件中指定用于多对多关联的id。

2 个答案:

答案 0 :(得分:1)

对于多对多关联,您需要一个连接两个表的中间表。所以在这种情况下,你有一个items表,一个locations表和一个第三个表items_locations,它有两列,item_idlocation_id (或者可能更多,取决于具体情况)。

在模型中,您通常会为此目的指定has_and_belongs_to_many关联。

在这种情况下,items表没有任何引用locations的列,因此您无需在灯具中添加一个。但是,您不需要为连接表使用单独的夹具。本文档解释了如何定义夹具中的关联:

http://api.rubyonrails.org/v3.2.13/classes/ActiveRecord/Fixtures.html

所以你会把这样的东西放在你的夹具中:

locations: location1, location2, location3

...然后在locations.yml灯具中定义这些位置。

答案 1 :(得分:0)

很抱歉挖出这个老问题,但我偶然发现同样的问题(数据已经在数据库中通过播种)并且只能通过这个hack来修复它,它可以工作,但非常难看并且可能容易出错:< / p>

# items_locations.yml
some_relation:
    item_id: <%= Item.find_by_name("some name").id %>
    location_id <%= Location.find_by_name('123 Main Street').id %>