transientとは
作成時に挙動を変更するためのフラグや追加データとして利用するのが一般的。
実際に作成するデータと直接関係無い新しいattribute
を定義する機能。
そこで定義されたものは実際のmodel
にはセットされずattributes_for
でも出力されない。
使用例
transient
は各attribute
の値にも利用でき、callback
でも利用可能。
FactoryBot.define do
factory :article do
sequence(:title) { |n| "title-#{n}" }
sequence(:slug) { |n| "slug-#{n}" }
category
end
trait :with_author do
transient do
sequence(:author_name) { |n| "test_author_name_#{n}"}
sequence(:tag_slug) { |n| "test_author_slug_#{n}"}
end
#build直後に自由にインスタンスを修正することができる。コールバック。
after(:build) do |article, evaluator|
article.author = build(:author, name: evaluator.author_name, slug: evaluator.tag_slug)
end
end
after_build
のブロック第2引数evaluator
を渡すことで、transient
ブロック内の変数にアクセスできる。
参考記事
FactoryGirlのtransientとtraitを活用する
FactoryBot(旧FactoryGirl)で関連データを同時に生成する方法いろいろ