その他
    ホーム 技術発信 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)