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

enumerizeを使っておきながら便利なオプションやメソッドを活用しきれていなかったので、
備忘録も兼ねてメソッドとオプションをまとめました！

### 最もベーシックな使用方法
```ruby
class User
  extend Enumerize

  enumerize :status, in: [:student, :employed, :retired]
end
```
これだけでモデルにinclusionバリデーションが追加されます（便利ぃ）
ここから更に便利なオプションやメソッドを紹介します！

## 目次
[skip_validationsオプション](#skip_validationsオプション)
[defaultオプション](#defaultオプション)
[scopeオプション](#scopeオプション)
[multipleオプション](#multipleオプション)
[predicatesオプション](#predicatesオプション)
[_textメソッド](#メソッド)
[valuesメソッド](#valuesメソッド)
[その他（enumerizeの値をカスタマイズする）](#その他)
[Rspec](#Rspec)

# オプション
### skip_validationsオプション
デフォルトで追加されるバリデーションをskipする

```ruby
class User
  extend Enumerize

  enumerize :status, in: [:student, :employed, :retired], skip_validations: true
end
```

### defaultオプション
デフォルトの値を設定できる
ActiveRecord::Enumでデフォルト値を設定する場合はDB側で設定する必要があるので、やっぱりenumerize優秀

```ruby
class User
  extend Enumerize

  enumerize :status, in: [:student, :employed, :retired], default: :student
end
```

### scopeオプション
#### scope: :true
scopeを生成し、with_やwithout_で絞り込みができるようになる

```ruby
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で宣言した値を直接メソッドのように使用し絞り込みができる

```ruby
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'
```


:::note warn
以下のmultipleオプションを使用している場合、scopeオプションは使用できま
:::

### multipleオプション
配列のように複数の値を保有できる

```ruby
class User
  extend Enumerize

  enumerize :interests, in: [:student, :employed, :retired], multiple: true
end

user = User.new
user.interests << :employed
user.interests << :retired
```


### predicatesオプション
booleanで判定できるようになる


```ruby
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で定義している文言を取得する

```ruby
@user.status_text # or @user.status.text
```

### values
enumerizeで定義している値を全て取得

```ruby
User.status.values # or User.enumerized_attributes[:status].values
# => ['student', 'employed', 'retired']
```

# その他
enumerizeの値はintなどカスタマイズが可能です

```ruby
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
便利なマッチャを利用すればテストを簡単に書くことができます


### ベーシックなテスト
```ruby
class User
  extend Enumerize

  enumerize :status, in: [:student, :employed, :retired]
end

describe User do
  it { is_expected.to enumerize(:status) }
end
```

### in
指定した値がenumerizeに定義されているかのテスト

```ruby
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
デフォルト値が設定されているかのテスト

```ruby
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オプションが適用されているかのテスト

```ruby
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オプションが適用されているかのテスト

```ruby
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オプションが適用されているかのテスト

```ruby
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
```