工厂在创建后分配关联

时间:2013-11-02 12:00:39

标签: ruby-on-rails ruby ruby-on-rails-4 factory-bot rspec-rails

我在Rails 4中有一个问题。

在我的 factories.rb 上,我有类似的内容:

factory :user do
   sequence(:name)   { |n| "User #{n}" }
   sequence(:email)  { |n| "user_#{n}@example.org" }
   password 'foobar'
   password_confirmation 'foobar'
end

问题是,我不知道在创建用户后添加关系。

当我创建用户并且他是主持人时,我为用户分配了以下角色:

u.add_role_id!(11)

我有不同的关系表, user_id role_id ,在用户模型上我有方法。

def add_role_id!(role)
   role_user_relationship.create!(role_id: Role.find(role).id)
end

我如何在 factories.rb 上执行此操作?

现在我要做的事情:

u = FactoryGirl.create(:moderator)
u.add_role_id!(11)

我想在 factories.rb

上默认指定

我是怎么做到的?!

谢谢大家!

马努

解决方案:

我必须添加这些行:

after(:create) do |u|
  u.add_roles_ids!([10,20,30])
end

使用整个代码:

factory :user do
   sequence(:name)   { |n| "User #{n}" }
   sequence(:email)  { |n| "user_#{n}@mudev.org" }
   password 'foobar'
   password_confirmation 'foobar'

   after(:create) do |u|
      u.add_roles_ids!([10,20,30])
   end
end

感谢Peter Alfvin

1 个答案:

答案 0 :(得分:1)

您可以使用https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#callbacks中描述的FactoryGirl after回调机制,通过在工厂定义中包含以下内容来获得与您现在正在执行的操作类似的行为:

after(:create) {|u| u.add_role_id!(11)

根据您的验证,您可以执行此操作after(:build)before(:create)