この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
社内でRails標準のEnumよりも多く使われているSelectableAttrについて。
EXAMPLE
カードのレアリティを 0 〜 5 の整数値で表現します
class Card < ActiveRecord::Base
include ::SelectableAttr::Base
selectable_attr :rarity do
entry 0, :N, 'ノーマル'
entry 1, :HN, 'ハイノーマル'
entry 2, :R, 'レア'
entry 3, :HR, 'ハイレア'
entry 4, :SR, 'スーパーレア'
entry 5, :LG, 'レジェンド'
end
end
BEFORE
レアリティの定数を参照するために、 xxx_id_by_key
というクラスメソッドを使っています。
if @card.rarity == Card.rarity_id_by_key(:SR)
puts "スーパーレアが限界突破!"
@card.rarity = Card.rarity_id_by_key(:LG)
@card.save!
end
AFTER
インスタンスメソッドに定義された xxx_key
を使えば、値をシンボルで取り出すことができます。
if @card.rarity_key == :SR
puts "スーパーレアが限界突破!"
@card.rarity_key = :LG
@card.save!
end
POINT
rarity
というアトリビュートが定義されていると、以下の3つのアクセサが定義されます。
#rarity_key
rarityの値に応じたシンボルを返す#rarity_key=
シンボルを受けて値に変換してrarityに代入する#ratity_name
rarityの値に応じた名称を返す
また、クラスメソッドのcreate
や、インスタンスメソッドのupdate
などハッシュを引数にとるメソッドもrarity_key
という名前でシンボルを受け付けるようになります。
card = Card.create(rarity_key: :LG)
card.update(rarity_key: :SR)
REFERENCE
https://github.com/akm/selectable_attr
VERSIONS
Ruby MRI 2.1.1
Rails gem 'rails', '4.1.4'
selectable_attr (0.3.17)
selectable_attr_rails (0.3.15)