首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >工厂女孩:如何在不创建新记录的情况下将一条记录关联到另一条记录?

工厂女孩:如何在不创建新记录的情况下将一条记录关联到另一条记录?
EN

Stack Overflow用户
提问于 2010-10-27 03:07:28
回答 3查看 5K关注 0票数 18

我使用Factory Girl/Rspec2/Rails 3。

在factories.rb中,我有:

代码语言:javascript
复制
Factory.define :user do |user|
  user.name       'Some guy'
  user.email      'some_guy@somewhere.org'
  user.password   'password'
end

Factory.define :org_admin, :parent => :user do |user|
  user.email 'org_admin@somehwere.org'
end

Factory.define :user_with_membership_request, :parent => :user do |user|
  user.email 'user_with_membership_request@somehwere.org'
end

Factory.define :organization do |org|
  org.name        'MEC'
  org.description 'Mountain Equipment Co-op'
end

Factory.define :membership do |membership|
  membership.user { Factory(:user) }
  membership.organization { Factory(:organization) }
end

Factory.define :admin_membership, :parent => :membership do |membership|
  membership.user { Factory(:org_admin) }
  membership.is_admin true
  membership.status 'active'
end

Factory.define :membership_request, :parent => :membership do |membership|
  membership.user { Factory(:user_with_membership_request) }
  membership.status 'requested'
end

然后在我的rspec测试中,我有:

代码语言:javascript
复制
  it 'should accept the membership request' do
    @org_admin = Factory(:org_admin)
    test_sign_in(@org_admin)
    @organization = Factory(:organization)
    @membership_request = Factory(:membership_request)

    put :update, :organization_id => @organization.id, :id => @membership_request.id, :acceptance => 'approve'
    ...
  end

当我运行测试时,我得到:

代码语言:javascript
复制
 Failure/Error: @membership_request = Factory(:membership_request)
 Validation failed: Name has already been taken

我理解失败的原因是因为FactoryGirl正在创建另一个组织(具有相同的名称)。

但我想做的是创建几个与同一组织相关联的成员资格。我该怎么做?

谢谢。

肖恩

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-27 03:28:25

您可以检查现有的组织并使用它,如果不存在,也可以创建一个:

代码语言:javascript
复制
Factory.define :membership do |membership|
  membership.user { Factory(:user) }
  membership.organization { Organization.first || Factory(:organization) }
end

FactoryGirl 4+更新:

代码语言:javascript
复制
Factory.define do
  factory :membership do
    user { create(:user) }
    organization { Organization.first || create(:organization) }
  end
end

另一种方法是为您想要重用的每个工厂使用唯一标识符(例如:名称),然后使用initialize_with生成它:

代码语言:javascript
复制
factory :organization_1 do
  ignore { organization_name 'Sample Organization 1' }
  name { organization_name }
  initialize_with { Organization.find_or_create_by_name(organization_name) }
end

现在,任何对:organization_1的引用都将检索相同的Organization。显然,您必须使用不同的名称才能正常工作。

票数 19
EN

Stack Overflow用户

发布于 2010-10-27 03:14:02

有两件事。1.您可能仍然希望为Factory(:organisation)创建唯一的名称,您可以使用Factory.sequence来实现这一点,它将为您唯一地生成它。2.您可以传入一个Factory(:membership_request, :organization => @organization)来使用已有的object,而无需创建新的object。

票数 4
EN

Stack Overflow用户

发布于 2011-10-12 01:32:36

对于mongoid,您可以将#find_or_create_by方法的使用与Factory.attributes_for结合使用,并执行以下操作

代码语言:javascript
复制
factory :membership do
    organization { Organization.find_or_create_by(Factory.attributes_for(:organization))}
end

我相信ActiveRecord也有类似的东西。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4027102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档