今回はenumの状態重複を回避することができる_prefix(接頭辞)と_suffix(接尾辞)について紹介したいと思います。enumを多用していると状態が重複してしまう場合が多々ありますが、今回の機能を使うことで一瞬で解決することができます。
概要
Rails5以前は同じ値を持ったenumを定義することができませんでした。
以下は:active
という値が重複してしまっている例になります。
class Conversation < ActiveRecord::Base
enum status: [:active, :archived], _suffix: true
enum comments_status: [:active, :inactive], _prefix: :comments
end
=> ArgumentError (You tried to define an enum named "comments_status" on the model "Conversation", but this will generate a instance method "active?", which is already defined by another enum.)
しかしRails5からはenumの定義時に_prefix(接頭辞)と_suffix(接尾辞)をつけることができるようになり、同じ値を持ったenumを複数定義できるようになりました。
# 定義例
class Conversation < ActiveRecord::Base
enum status: [:active, :archived], _suffix: true
enum comments_status: [:active, :inactive], _prefix: :comments
end
_prefix(接頭辞)
語構成要素の一。単独では用いられず、常に他の語の上について、その語とともに一語を形成するもの。語調を整えたり、意味を添加したりする。「お話」「こ犬」「御親切」などの「お」「こ」「御」の類。接頭辞。⇔接尾語。
参照: デジタル大辞泉
先ほどの例に_prefix(接頭辞)を付けた場合は以下のようになります。
class Conversation < ActiveRecord::Base
enum status: [:active, :archived], _prefix: true
enum comments_status: [:active, :inactive], _prefix: true
end
これにより以下のようなアクセスが可能になります。
# status処理
> conversation.status_active?
> conversation.status_active!
> conversation.status_archived?
> conversation.status_archived!
# comment_status処理
> conversation.comment_status_active?
> conversation.comment_status_active!
> conversation.comment_status_inactive?
> conversation.comment_status_inactive!
_suffix(接尾辞)
語構成要素の一。単独では用いられず、常に他の語の下について、その語とともに一語を形成するもの。意味を添加するもののほかに、上の語の文法的機能を変える働きをもつものがある。「彼ら」「殿さま」などの「ら」「さま」は前者、「深さ」「春めく」「男らしい」などの「さ」「めく」「らしい」は後者の例。接尾辞。⇔接頭語。
参照: デジタル大辞泉
_suffix(接尾辞)を付けた場合は以下のようになります。
class Conversation < ActiveRecord::Base
enum status: [:active, :archived], _suffix: true
enum comments_status: [:active, :inactive], _suffix: true
end
これにより以下のようなアクセスが可能になります。
# status処理
> conversation.active_status?
> conversation.active_status!
> conversation.archived_status?
> conversation.archived_status!
# comment_status処理
> conversation.active_comment_status?
> conversation.active_comment_status!
> conversation.inactive_comment_status?
> conversation.inactive_comment_status!
カスタム値
_prefix: true
や_suffix: true
のtrue部分にはオリジナルの値、カスタム値を設定することもできます。
comment_status側に_prefix: :comments
というカスタム値を設定しました。
class Conversation < ActiveRecord::Base
enum status: [:active, :archived], _suffix: true
enum comments_status: [:active, :inactive], _prefix: :comments
end
これにより以下のようなアクセスが可能になります。
> conversation.comments_active?
> conversation.comments_active!
> conversation.comments_inactive?
> conversation.comments_inactive!
_suffix: :comments
を定義した場合は以下のようになります。
class Conversation < ActiveRecord::Base
enum status: [:active, :archived], _suffix: true
enum comments_status: [:active, :inactive], _suffix: :comments
end
> conversation.active_comments?
> conversation.active_comments!
> conversation.inactive_comments?
> conversation.inactive_comments!
まとめ
- Rails5からenumの定義時に_prefix(接頭辞)と_suffix(接尾辞)をつけることができるようになり、同じ値を持ったenumを複数定義できるようになった
- _prefix(接頭辞)と_suffix(接尾辞)の他にカスタム値も設定することができる
参考
Ruby on Rails 5.2.4.4 Module ActiveRecord::Enum
今回はenumの状態重複を回避することができる_prefix(接頭辞)と_suffix(接尾辞)について紹介しました。enum値が重複してしまうため違和感のある命名になっている箇所があれば、ぜひ_prefix(接頭辞)と_suffix(接尾辞)を試してみてください。