22
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

enumerizeのオプション・メソッドまとめ

Posted at

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
22
9
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
22
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?