这些是2个简单的模型:

class Post < ActiveRecord::Base
  has_one :asset, :dependent => :destroy

  validates :asset, presence: true
end

class Asset < ActiveRecord::Base
  belongs_to :post
end

我正在尝试创建一个像这样的工厂:
  factory :post do
    # fields...

    asset { FactoryGirl.create(:asset) }
  end

  factory :asset do
    # fields...

    post
  end

但是,运行规范会进入循环。

我也试过这个:
  factory :post do
    # fields...

    before(:create) do |post, evaluator|
      FactoryGirl.create_list(:asset, 1, post: post)
    end
  end

但是最终出现在“验证失败: Assets 不能为空”。

我如何代表我的情况?

最佳答案

我使用after(:build)回调解决了这个问题。

factory :post do
    # fields...
    after(:build) do |post|
      post.asset ||= FactoryGirl.build(:asset, :post => post)
    end
end

factory :asset do
    # fields...
    after(:build) do |asset|
      asset.post ||= FactoryGirl.build(:post, :asset => asset)
    end
end

通过这种方式,将在保存拥有的类之前创建关联的对象,因此验证通过。

关于ruby-on-rails - FactoryGirl,has_one关联和验证失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17034423/

10-15 11:22