I have a table where the data_value is set based on option_id. Example,
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
How do I make FactoryBot generate data_value based on the option_id?
You can make that work with an after(:build) callback which will let you do things to the generated object after it is created but before it's returned. Depending on how your class actually works, you may not want to store option_id directly on the class. In that case, you can use the values object in the block to read the original value passed into the factory.
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))
Those last three lines will output something like:
#<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">
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With