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