Rubyでconstantクラスを作った時にちょっとした気づきがあったのでメモです
「定数がいろいろと定義されている中で一部違うんだけど、他の定数はほぼ同じ」みたいな状況の中でただダラダラと書いていくとこんな感じになります
DRYじゃないですね
module HogePolicy
module Limited
NAME = '規制'
MAX_SUM = 30
end
module Unlimited
NAME = '有料'
MAX_SUM = Float::Infinity
end
module Trial
NAME = '試用'
MAX_SUM = Float::Infinity
end
end
で、こういうの何かできないかなーって思ってたんですけど、よくよく考えてみると include
使えば良いんじゃ無いってなってやってみたらできてしまいました
定数の数が増えると効果が目に見えて出てきます
module HogePolicy
module Limited
NAME = '規制'
MAX_SUM = 30
end
module Unlimited
NAME = '有料'
MAX_SUM = Float::Infinity
end
module Trial
include HogePolicy::Unlimited
NAME = '試用'
# MAX_SUMは定義されている
end
end
ちなみにこういうのを呼び出すときも Limited
にするか Unlimited
にするか Trial
にするかみたいなロジックを書こうとした時にModelクラスにenum作って、更に判定メソッド作っておくとview側でスッキリ書けます
class User < ActiveRecord::Base
enum limiter: {
limited: 'limited',
unlimited: 'unlimited',
trial: 'trial'
}
def limitation
if limited?
HogePolicy::Limited
elsif unlimited?
HogePolicy::Unlimited
elsif trial?
HogePolicy::Trial
end
end
end
こういう感じで書いておけば user.limitation
を呼び出せば自然とそのユーザのステータス定数を持ってくることが可能なので便利です
特にerrorハンドリングなどのところとかに HogePolicy::ステータス
とか書かなくて済むので、スッキリした感じになります
地味に好きな書き方です