10
3

More than 3 years have passed since last update.

FactoryBotでポリモーフィックなアソシエーションを生成する

Posted at

はじめに

FactoryBotを書いてて、ポリモーフィック関連を自動生成するにはどうしたらいいんじゃ!
と思って調べたので、忘備録です。

やりたいこと

例えばツイッターのようなアプリを作ることを考えて、Postテーブルを作ることにします。Postテーブルには投稿主を表すpostable_idがあるとします。
投稿できるのは、一般のUserの他に別テーブルで管理されてるCompanyも投稿できるようにしたとしましょう。すなわちUserとCompanyはPostとポリモーフィックな関係で結ばれています。

User ----|
         |---- Post
Company--|

この時、postを生成するのと同時にuserやcompanyをFactoryBotで自動的に生成する方法を説明します。

解決

では 早速コードをみてみましょう。
まずは、デフォルトで用意されてるかもしれませんが、userとcompanyを作成するファクトリを用意します。

factories/users.rb
FactoryBot.define do
  factory :user, class: 'User' do
   name { 'test' }
  end
end
factories/companies.rb
FactoryBot.define do
  factory :company, class: 'Company' do
   name { 'test' }
  end
end

上記は特になんの変哲のないファクトリーです。specにcreate(:user)みたく書けばuserを作成できるでしょう。
続いてPostのファクトリーは以下のようになります。

factories/posts.rb
# userのpostを生成(postと一緒にuserができる)
FactoryBot.define do
  factory :user_post, class: 'Post' do
    postable_type { 'User' }
    #ポリモーフィック関連の名前を指定して、userを生成するfactorを呼ぶ
    association :postable, factory: :user
  end

# companyのpostを生成(postと一緒にcomapnayができる)
  factory :company_post, class: 'Post' do
    postable_type { 'Company' }
    #ポリモーフィック関連の名前を指定して、userを生成するfactorを呼ぶ
    association :postable, factory: :company
  end
end

肝はassociationでfactoryを指定することです。これによってuserかcompanyを自動で作成してくれます。
もちろんspecではcreate(:user_post)で問題ありません。
便利なので是非ご活用ください!

10
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
3