おおいしつかさ


旅行とバイクとドライブと料理と宇宙が好き。
Ubie Discoveryのプログラマ。
Share:  このエントリーをはてなブックマークに追加

acts_as_state_machineのfind_in_stateを複数状態指定可能にする

acts_as_state_machineのfind_in_stateは便利ですが、stateはひとつしか指定できません。たとえば、登録ユーザと管理者ユーザの両方でログイン可能なときなどはちょっとメンドくさいです。
なので、find_in_stateで複数のstate指定をできるようにしてみました。
config/initializers/acts_as_state_machine.rbを新規作成して以下のコードを書きます。

module ScottBarron  
  module Acts  
    module StateMachine  
      module ClassMethods  
        protected  
        def with_state_scope(target_states)  
          target_states = [target_states] unless target_states.is_a?(Array)  
          raise InvalidState unless target_states.all? {|s| states.include?(s)}  

          cond = []  
          cond_param = []  
          target_states.each do |st|  
            cond << "#{table_name}.#{state_column} = ?"  
            cond_param << st.to_s  
          end  

          with_scope :find => {:conditions => [cond.join(" OR "), cond_param].flatten} do  
            yield if block_given?  
          end  
        end  
      end  
    end  
  end  
end  

これで、複数の指定をarrayで指定できるようになります。

u = find_in_state :first, [:active, :admin], :conditions => {:email => email}  

count_in_stateもcalculate_in_stateも複数指定可になります。ちょっと便利になりました。