如何为 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_girl
s 自述文件更新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 关系设置我的装置?的主要内容,如果未能解决你的问题,请参考以下文章
如何为 RecyclerView 设置 onItemClickListener? [复制]