selectable_attrって何さ?

定数定義を分かりやすくするために僕が作っているプラグインです。こんな風に思う方に強くオススメです。

  • マジックナンバーを撲滅したい
  • 値とプログラム上での記述と表示上の名称をひとまとめに書きたい
  • select_tagとかに渡す選択肢(option_tags)をいちいち自分で作るのめんどい
  • Rubyで定数をどこかにまとめて書くなんてあり得ない

例えば、selectable_attrを使わないで書くと、以下のように結構記述量がありますが、

  class LegacyProduct1 < ActiveRecord::Base
    set_table_name 'products'
    
    PRODUCT_TYPE_BOOK = '01'
    PRODUCT_TYPE_DVD = '02'
    PRODUCT_TYPE_CD = '03'
    PRODUCT_TYPE_OTHER = '09'
    
    PRODUCT_TYPE_OPTIONS = [
      ['書籍', PRODUCT_TYPE_BOOK],
      ['DVD', PRODUCT_TYPE_DVD],
      ['CD', PRODUCT_TYPE_CD],
      ['その他', PRODUCT_TYPE_OTHER]
    ]
    
    DISCOUNT = { 
      PRODUCT_TYPE_BOOK => 0.8,
      PRODUCT_TYPE_DVD => 0.2,
      PRODUCT_TYPE_CD => 0.5,
      PRODUCT_TYPE_OTHER => 1
    }
    
    def discount_price
      (DISCOUNT[product_type_cd] * price).to_i
    end
  end

selectable_attrを使うとこんな風にすっきり書けます。

  class Product1 < ActiveRecord::Base
    set_table_name 'products'
    
    selectable_attr :product_type_cd do
      entry '01', :book, '書籍', :discount => 0.8
      entry '02', :dvd, 'DVD', :discount => 0.2
      entry '03', :cd, 'CD', :discount => 0.5
      entry '09', :other, 'その他', :discount => 1
    end
 
    def discount_price
      (product_type_entry[:discount] * price).to_i
    end
  end

で、これだけじゃよく分からないと思うので、紹介用にテストを書いてみました。
http://github.com/akm/selectable_attr/tree/master/test/introduction_test.rb