我有一个表,其中的data_value是基于option_id设置的。例如,
option_id: 1 , data_value: `date value`
option_id: 2, data_value: number
option_id: 3, data_value: text
FactoryBot.define do
factory :test do
sequence(:option_id, (1..3).cycle) { |n| n }
data_value {??}
end
end如何让FactoryBot基于option_id生成data_value?
发布于 2019-09-24 08:47:45
您可以使用after(:build) callback来实现这一点,它允许您在创建对象之后、返回对象之前对生成的对象执行操作。根据您的类的实际工作方式,您可能不希望将option_id直接存储在类中。在这种情况下,you can use the values object在块中读取原始值传递到工厂。
require 'factory_bot'
require 'ostruct'
FactoryBot.define do
factory :test, class: OpenStruct do
sequence(:option_id, (1..3).cycle) { |n| n }
after(:build) do |o, values|
o.data_value = case values.option_id
when 1
Time.now
when 2
5
when 3
'hello world'
end
end
end
end
puts(FactoryBot.build(:test))
puts(FactoryBot.build(:test))
puts(FactoryBot.build(:test))最后三行将输出类似以下内容:
#<OpenStruct option_id=1, data_value=2019-09-24 00:44:01 +0000>
#<OpenStruct option_id=2, data_value=5>
#<OpenStruct option_id=3, data_value="hello world">https://stackoverflow.com/questions/58070628
复制相似问题