ホーム DoRuby 3分リファクタリング SelectableAttr 編
3分リファクタリング SelectableAttr 編
 

3分リファクタリング SelectableAttr 編

この記事はアピリッツの技術ブログ「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)

記事を共有

最近人気な記事