我正在为库存系统开发Rails 2.3.5项目。主要对象是Item
,其中包含State
和Zipcode
等关联对象。它还具有与Location
的多对多关联(HABTM);因此,Item
可以包含零个,一个或多个Locations
。
我在db/seeds.rb
中使用种子数据来加载State
,Zipcode
和Location
数据,因为该数据对于此项目的所有实例都是相同的。< / 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_id
和zipcode_id
正常工作。我的问题是locations_id
行。我不知道如何在fixture文件中指定用于多对多关联的id。
答案 0 :(得分:1)
对于多对多关联,您需要一个连接两个表的中间表。所以在这种情况下,你有一个items
表,一个locations
表和一个第三个表items_locations
,它有两列,item_id
和location_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 %>