はじめに
enumのtraitをひとつずつ書いていたところ、factory_botでモデルのenum別のtraitを一発で書く小ネタを見つけました。
今回、この記事とは異なる書き方でtraitを書く方法が分かったので、まとめていきます。
コード
モデル
例えば、UserがSpotifyのプランごとのステータスを持っていたとします。
app/models/user.rb
class User < ApplicationRecord
validates :name, presence: true
enum :plan { free: 0, individual: 1, family: 2, student: 3 }
end
このplan
それぞれにtraitを作ってもいいのですが、enumの数に比例して行数が増えます。
さらに、Spotifyにプランが追加されたときに、設定を忘れる恐れがあります。
ファクトリ
上記のモデルのtraitの行数を減らすために、このように書くことができます。
spec/factories/user.rb
FactoryBot.define do
factory :user do
name { "hoge" }
User.plans.keys.each do |plan|
trait :"#{plan}" do
status { plan }
end
end
end
end
【ポイント】
-
enumにつけた名前を複数形にする
この例では、plans
と複数形に直しています -
enumの名前(複数形)のkeyを取り出す
コンソールで表示すると以下のとおりになります。
keys
で取り出すと、enumのkeyとしての名前でtraitを作ることができます!
[1] pry(main)> Tag.statuses
=> {"free"=>0, "individual"=>1, "family"=>2, "student"=>3}
[2] pry(main)> Tag.statuses.keys
=> ["free", "individual", "family", "student"]
[3] pry(main)> Tag.statuses.values
=> [0, 1, 2, 3]