Ruby on rails 关联模型的改进

Ruby on rails 关联模型的改进,ruby-on-rails,factory-bot,model-associations,Ruby On Rails,Factory Bot,Model Associations,我有三种模式:用户、产品和所有权。所有权属于用户和产品。产品和用户拥有多种所有权 我用FactoryGirl gem创建了以下工厂: factory:user do 序列(:name){n}“Robot{n}” 顺序(:email){n|“numero{n}@robots.com} 关联:位置,工厂::位置 结束 工厂:产品做什么 序列(:name){n}“Objet{n}} 关联:位置,工厂::位置 结束 工厂:所有权如何 关联:用户,工厂::用户 协会:产品,工厂::产品 结束 我是这样用

我有三种模式:用户、产品和所有权。所有权属于用户和产品。产品和用户拥有多种所有权

我用FactoryGirl gem创建了以下工厂:

factory:user do
序列(:name){n}“Robot{n}”
顺序(:email){n|“numero{n}@robots.com}
关联:位置,工厂::位置
结束
工厂:产品做什么
序列(:name){n}“Objet{n}}
关联:位置,工厂::位置
结束
工厂:所有权如何
关联:用户,工厂::用户
协会:产品,工厂::产品
结束
我是这样用的:

let(:user){FactoryGirl.create(:user)}
let(:product){FactoryGirl.create(:product)}
let(:所有权){FactoryGirl.create(:当前所有权,用户:用户,产品:产品)}
但为了做到这一点,我想改善我的工厂:

let(:user){FactoryGirl.create(:user)}
let(:product){FactoryGirl.create(:product,所有者:用户)}

您知道怎么做吗?

您可以在创建回调后使用factory girl来执行此操作:

FactoryGirl.define do
  factory :product do
    # ...

    ignore do
      owner nil
    end

    after :create do |product, ev|
      if ev.owner
        create :ownership, user: ev.owner, product: product
      end
    end
  end
end
通过这种方式,您可以配置工厂,以便将所有者属性传递给它。ignore块确保该属性不会传递给对象的构造函数,但您可以在factory girl的回调中使用它


您可以找到有关factory girl回调的更多信息。

谢谢!这是在创建之前的
还是在创建之后的
?什么是ev?是的,我错了,在你的例子中,它应该是在:create
之后。我在回答中已经改正了。ev(回调的第二个参数)是factory girl传递给回调的evaluator对象。它允许您访问被忽略的属性。