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

Tsukasa OISHI

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も複数指定可になります。ちょっと便利になりました。