読者です 読者をやめる 読者になる 読者になる

FactoryGirlで関連するデータを生成するときに論理削除状態のデータを避ける方法

ruby

factory_girlact_as_paranoiaを使用して論理削除を行っている場合に、FactoryGirlを使用してデータを生成するとどうしても一定のルールで論理削除状態のデータを生成することになると思います。たとえば、偶数は論理削除だとか、、、ところが、関連する側では一般に論理削除状態を参照しないようなテストデータを生成したいことがままあります。

そんなときに、個別にテストデータを生成するように定義すると重複が発生してしまい無駄が多くなります。fixutureと同じ感じでよくわからないデータがたくさんできるようなイメージになると思います。いちばんよい方法は、関連として取得したデータを適切に加工できることでしょう。

FactoryGirlではデータの生成時にフィールドを指定して値を設定できるようなので、とても簡単にテストデータを作成することができます。

[ruby]

ここで deleted_at には nil を設定している。

exp.account_code {FactoryGirl.create(:account_code, deleted_at: nil)} [/ruby]

このように FactoryGirl.create で指定した account_code のインスタンスについて deleted_at フィールドについては nil を設定するようにしています。

該当する FactoryGirl の内容は以下の通りです。 [ruby] FactoryGirl.define do factory :expenditure, class: Expenditure do |exp| exp.expend_name {FactoryGirl.generate(:exp_name)} exp.expend_desc "テストデータ"

# ここで deleted_at には nil を設定している。
exp.account_code {FactoryGirl.create(:account_code, deleted_at: nil)}

exp.create_user_id 1
exp.update_user_id 1
exp.team_id 1
exp.deleted_at {Time.now unless FactoryGirl.generate(:exp_seq)%2 != 0}

end

# 連番を取得する sequence :exp_seq do |n| n end

sequence :exp_name do |n| "経費区分_#{n}" end end [/ruby]

こんな感じで簡単に関連するデータを加工して思い通りのデータを取得できます。FactoryGirlはすばらしいですね。