如何为has_and_belongs_to_many关系设置我的灯具?

时间:2012-05-14 06:51:19

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord fixtures

我有以下型号:

class Company < ActiveRecord::Base
  has_and_belongs_to_many :regions

class Region < ActiveRecord::Base
  has_many :requests
  has_and_belongs_to_many :companies

class RequestForProposals < ActiveRecord::Base
  belongs_to :region

每当我收到新请求时,我都会向同一地区的公司发送通知。

如何在我的灯具中进行设置,以便我可以单独测试寻找合适公司的逻辑?

我试过

region_ids: 1, 2
regions: one, two

在companies.yml中,但不适用于为公司分配区域。

以下是SQL生成的要点:https://gist.github.com/2713518

4 个答案:

答案 0 :(得分:34)

有关

regions: one, two

companies.yml工作,您需要让rails自动为区域分配ID。这是因为(为了避免在companies.yml之前必须读取regions.yml),rails会根据公司灯具的名称计算它在连接表中的ID。如果您自己分配了ID,则它们将与计算出的ID不匹配。

从您提供的sql看起来,您将区域上的ID设置为1和2,即您的regions.yml已

one:
  id: 1
  name: MyString 

删除id:1,你应该没问题。您还需要更新引用区域的任何其他文件(例如request_for_proposals.yml),替换

region_id: 1

region: one

Rails会知道这意味着将region_id设置为您的灯具中带有标签one的区域的ID。

答案 1 :(得分:0)

我不确定这些天如何使用YAML灯具。您是否尝试FactoryGirl在测试时创建数据库对象实例?它的确与固定装置几乎完全相同,但却非常复杂。

以下段落假设您使用rspec作为测试框架。

factory_girl-rails中加入Gemfile并相应地更新spec/spec_helper.rb自述文件后,请创建以下文件:

factory_girl

现在真正的问题是 - 你正在做的实际测试代码是什么?

答案 2 :(得分:0)

您的regions.yml是test / fixtures目录吗? companies.yml怎么样?对于给定公司,您的代码“区域:一,二”应该有效 运行测试时,Rails会自动加载此目录中的灯具。 如果位置正确,请在运行测试时发布测试输出 - 生成的sql。

答案 3 :(得分:0)

如果您需要自己计算此ID,请接受已接受的答案,例如:你有一些松散的引用或其他数据源只是添加:

def fixh(key)
  ActiveRecord::FixtureSet.identify key
end

到你的test_helper.rb,然后在灯具中使用这种方式:

security_context1:
  ext_id: <%= fixh :user1 %>