enumerizeを使っておきながら便利なオプションやメソッドを活用しきれていなかったので、
備忘録も兼ねてメソッドとオプションをまとめました!
最もベーシックな使用方法
class User
extend Enumerize
enumerize :status, in: [:student, :employed, :retired]
end
これだけでモデルにinclusionバリデーションが追加されます(便利ぃ)
ここから更に便利なオプションやメソッドを紹介します!
目次
skip_validationsオプション
defaultオプション
scopeオプション
multipleオプション
predicatesオプション
_textメソッド
valuesメソッド
その他(enumerizeの値をカスタマイズする)
Rspec
オプション
skip_validationsオプション
デフォルトで追加されるバリデーションをskipする
class User
extend Enumerize
enumerize :status, in: [:student, :employed, :retired], skip_validations: true
end
defaultオプション
デフォルトの値を設定できる
ActiveRecord::Enumでデフォルト値を設定する場合はDB側で設定する必要があるので、やっぱりenumerize優秀
class User
extend Enumerize
enumerize :status, in: [:student, :employed, :retired], default: :student
end
scopeオプション
scope: :true
scopeを生成し、with_やwithout_で絞り込みができるようになる
class User < ActiveRecord::Base
extend Enumerize
enumerize :status, in: [:student, :employed, :retired], scope: true
end
User.with_status(:student)
# SELECT "users".* FROM "users" WHERE "users"."status" IN ('student')
User.without_status(:student)
# SELECT "users".* FROM "users" WHERE "users"."status" NOT IN ('student')
scope: :shallow
enumerizeで宣言した値を直接メソッドのように使用し絞り込みができる
class User < ActiveRecord::Base
extend Enumerize
enumerize :status, in: [:student, :employed, :retired], scope: :shallow
end
User.student
# SELECT "users".* FROM "users" WHERE "users"."status" = 'student'
以下のmultipleオプションを使用している場合、scopeオプションは使用できま
multipleオプション
配列のように複数の値を保有できる
class User
extend Enumerize
enumerize :interests, in: [:student, :employed, :retired], multiple: true
end
user = User.new
user.interests << :employed
user.interests << :retired
predicatesオプション
booleanで判定できるようになる
class User
extend Enumerize
enumerize :status, in: [:student, :employed, :retired], predicates: true
end
user = User.new
user.student? # => false
user.employed? # => false
user.status = :student
user.student? # => true
user.employed? # => false
predicatesオプションやscopeオプションはprefixで名付けすることも可能です
メソッド
主にI18nのサポートをする為のメソッド
*_text / .text
I18nで定義している文言を取得する
@user.status_text # or @user.status.text
values
enumerizeで定義している値を全て取得
User.status.values # or User.enumerized_attributes[:status].values
# => ['student', 'employed', 'retired']
その他
enumerizeの値はintなどカスタマイズが可能です
class User
extend Enumerize
enumerize :status, in: [:student => 1, :employed => 2, :retired => 3]
end
user = User.new
user.status = :student
user.status #=> 'student'
user.status_value #=> 1
User.status.find_value(:student).value #=> 1
User.status.find_value(:employed).value #=> 2
Rspec
便利なマッチャを利用すればテストを簡単に書くことができます
ベーシックなテスト
class User
extend Enumerize
enumerize :status, in: [:student, :employed, :retired]
end
describe User do
it { is_expected.to enumerize(:status) }
end
in
指定した値がenumerizeに定義されているかのテスト
class User
extend Enumerize
enumerize :status, in: [:student, :employed, :retired]
end
describe User do
it { should enumerize(:status).in(:student, :employed, :retired) }
end
with_default
デフォルト値が設定されているかのテスト
class User
extend Enumerize
enumerize :status, in: [:student, :employed, :retired], default: :student
end
describe User do
it { should enumerize(:status).in(:student, :employed, :retired).with_default(:student) }
end
with_predicates
predicatesオプションが適用されているかのテスト
class User
extend Enumerize
enumerize :status, in: [:student, :employed, :retired], predicates: true
end
describe User do
it { should enumerize(:status).in(:student, :employed, :retired).with_predicates(true) }
end
with_scope
scope
scopeオプションが適用されているかのテスト
class User
extend Enumerize
enumerize :status, in: [:student, :employed, :retired], scope: true
end
describe User do
it { should enumerize(:status).in(:student, :employed, :retired).with_scope(true) }
end
with_multiple
multipleオプションが適用されているかのテスト
class User
extend Enumerize
enumerize :status, in: [:student, :employed, :retired], multiple: true
end
describe User do
it { should enumerize(:status).in(:student, :employed, :retired).with_multiple(true) }
end