都道府県ランキングみたいなものを持っているモデルのファクトリでハマったのでメモ。
以下のように都道府県ランキング属性の生成を、配列からのshift
で書いていたら、48回目の呼び出しからField 'ranking' doesn't have a default value
と落ちるようになった。
FactoryGirl.define do
nums = (1..47).to_a.shuffle
factory :hoge do
ranking { nums.shift }
end
end
FactoryGirlの属性にブロックを渡すと動的に評価される。
どうやらファクトリがロードされた時に確保されるであろうnums
をファクトリが保持していて、48回目以降は空配列からのshift
になっている模様。
sequenceの番号保持するのと同じイメージ?
ブロックを外すと、テストは落ちないけど、nums
が同じ内容を返すようになった。これはまあ同じ配列からshift
しているから。
この挙動をちゃんと調べようと思ったけどコード読むパワーが無かった。
(多分このへん?→https://github.com/thoughtbot/factory_girl/blob/master/lib/factory_girl/attribute/dynamic.rb)
結果根本的な解決にはなっていないけど、uniqueは気にしないことにしてRandom.rand(1..47)
にした。
uniqueな乱数入れるにはどうしたものか...