Ruby on rails 工厂女孩的额外争论

Ruby on rails 工厂女孩的额外争论,ruby-on-rails,ruby,factory-bot,Ruby On Rails,Ruby,Factory Bot,我需要将额外的参数传递给factory girl,以便在回调中使用。类似这样(但实际上更复杂): 然后用如下方式创建它: Factory.create(:blog, :sample_posts => [post1, post2]) 有什么办法吗 一个选项是为附加帖子创建虚拟访问器,这些帖子是在创建钩子检查后创建的: class Blog has_many :posts attr_accessible :name, :title, ... # DB columns attr_a

我需要将额外的参数传递给factory girl,以便在回调中使用。类似这样(但实际上更复杂):

然后用如下方式创建它:

Factory.create(:blog, :sample_posts => [post1, post2])

有什么办法吗

一个选项是为附加帖子创建虚拟访问器,这些帖子是
在创建钩子检查后创建的:

class Blog
  has_many :posts
  attr_accessible :name, :title, ... # DB columns
  attr_accessor   :sample_posts      # virtual column
end

Factory.define :blog do |blog|
  blog.name 'Blah'

  blog.after_create do |b|
    b.posts += b.sample_posts
    b.save!
  end
end

Factory(:blog, :sample_posts => [post1, post2])

另一个选项是使用
build
而不是
create
,并将
:autosave
添加到集合中:

class Blog
  has_many :posts, :autosave => true
end

Factory.define :blog do |blog|
  blog.name 'Blah'
  blog.posts { |_| [Factory.build(:post)] }
end

Factory(:blog, :posts => [post1, post2])
#or
Factory.build(:blog, :posts => [unsavedPost1, unsavedPost2])

显然,如果没有需要修改模型本身的变通方法,这在目前是不可能的。此错误报告于:

由于瞬态属性()

例如:

FactoryGirl.define do
  factory :user do
    transient do
      bar_extension false
    end
    name {"foo #{' bar' if bar_extension}"}
  end
end

# Factory(:user).name = "foo"
# Factory(:user, :bar_extension => true).name = "foo bar"
对于小于5.0的Factory Girl版本:

FactoryGirl.define do
  factory :user do
    ignore do
      bar_extension false
    end
    name {"foo #{' bar' if bar_extension}"}
  end
end

# Factory(:user).name = "foo"
# Factory(:user, :bar_extension => true).name = "foo bar"

如果您在factorygirl文件中打开类,我建议您这样做

require "user"
class User
  attr :post_count
end

因此,您正在打开类,而不是覆盖它

对于我的示例,我的实际情况要复杂一些。此外,我不喜欢因为FactoryGirl的局限性而污染模型。无论如何,谢谢:)您只需在
测试环境中污染模型即可。事实上,您可以在
工厂中执行此操作。rb
。问题49最近已关闭,请参阅我在此处提供的有用文档集,包括如何从创建后或其他块访问临时属性:
忽略
已弃用。改用
transient
。@JonathanTran非常感谢,我编辑了我的答案以反映变化!
require "user"
class User
  attr :post_count
end