如何为 has_and_belongs_to_many 关系设置我的装置?

Posted

技术标签:

【中文标题】如何为 has_and_belongs_to_many 关系设置我的装置?【英文标题】:How do I set up my fixtures for a has_and_belongs_to_many relation? 【发布时间】:2012-05-21 15:49:30 【问题描述】:

我有以下型号:

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

【问题讨论】:

【参考方案1】:

我不确定这些天人们如何使用 YAML 固定装置。您是否尝试过FactoryGirl 在测试时创建数据库对象实例?它的功能与固定装置几乎相同,但方式要复杂得多。

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

在您的Gemfile 中包含factory_girl-rails 并根据factory_girls 自述文件更新spec/spec_helper.rb 后,创建以下文件:

# spec/factories/company_factories.rb
FactoryGirl.define do
  factory :company do
    title  |n| "Test Company #n" 

    # whatever else fields

    after_create  |company| company.regions << FactoryGirl.create(:region) 
  end
end

# spec/factories/region_factories.rb
FactoryGirl.define do
  factory :region do
    # whatever fields here
  end
end

# spec/factories/request_factories.rb
FactoryGirl.define do
  factory :request do        
    # whatever fields here
  end
end

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

【讨论】:

【参考方案2】:

你的 region.yml 在 test/fixtures 目录中吗? company.yml 怎么样?对于给定的公司,您的代码“区域:一、二”应该可以工作。 当您运行测试时,Rails 会自动加载此目录中的固定装置。 如果位置正确,请在运行测试时发布测试输出 - 生成的 sql。

【讨论】:

是的,fixtures 文件在 test/fixtures 目录中【参考方案3】:

对于

regions: one, two

companies.yml 中,您需要让rails 自动分配区域的ID。这是因为(为了避免必须在 company.yml 之前读取 region.yml)rails 会根据公司固定装置的名称计算它在连接表中的 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。

【讨论】:

【参考方案4】:

如果您需要自己计算此类 id,则除了接受的答案外,例如您有一些松散的引用或其他数据源只需添加:

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

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

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

【讨论】:

你会推荐我把这个fixh(key)方法放在哪里?我认为我没有正确实施。

以上是关于如何为 has_and_belongs_to_many 关系设置我的装置?的主要内容,如果未能解决你的问题,请参考以下文章

如何为下拉菜单制作 CSS 边框?

如何为 CAShapeLayer 路径和填充颜色设置动画

iPhone - 如何为图像着色?

如何为 RecyclerView 设置 onItemClickListener? [复制]

WCF - 如何为 NTLM 身份验证配置 netTcpBinding?

如何为 UIToolbar 上的按钮添加滚动?