<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -192,13 +192,8 @@ module ActiveSupport
         end
 
         def should_run_callback?(*args)
-          if options[:if]
-            evaluate_method(options[:if], *args)
-          elsif options[:unless]
-            !evaluate_method(options[:unless], *args)
-          else
-            true
-          end
+          [options[:if]].flatten.compact.all? { |a| evaluate_method(a, *args) } &amp;&amp;
+          ![options[:unless]].flatten.compact.any? { |a| evaluate_method(a, *args) }
         end
     end
 </diff>
      <filename>activesupport/lib/active_support/callbacks.rb</filename>
    </modified>
    <modified>
      <diff>@@ -53,10 +53,41 @@ class Person &lt; Record
 end
 
 class ConditionalPerson &lt; Record
+  # proc
   before_save Proc.new { |r| r.history &lt;&lt; [:before_save, :proc] }, :if =&gt; Proc.new { |r| true }
   before_save Proc.new { |r| r.history &lt;&lt; &quot;b00m&quot; }, :if =&gt; Proc.new { |r| false }
   before_save Proc.new { |r| r.history &lt;&lt; [:before_save, :proc] }, :unless =&gt; Proc.new { |r| false }
   before_save Proc.new { |r| r.history &lt;&lt; &quot;b00m&quot; }, :unless =&gt; Proc.new { |r| true }
+  # symbol
+  before_save Proc.new { |r| r.history &lt;&lt; [:before_save, :symbol] }, :if =&gt; :yes
+  before_save Proc.new { |r| r.history &lt;&lt; &quot;b00m&quot; }, :if =&gt; :no
+  before_save Proc.new { |r| r.history &lt;&lt; [:before_save, :symbol] }, :unless =&gt; :no
+  before_save Proc.new { |r| r.history &lt;&lt; &quot;b00m&quot; }, :unless =&gt; :yes
+  # string
+  before_save Proc.new { |r| r.history &lt;&lt; [:before_save, :string] }, :if =&gt; 'yes'
+  before_save Proc.new { |r| r.history &lt;&lt; &quot;b00m&quot; }, :if =&gt; 'no'
+  before_save Proc.new { |r| r.history &lt;&lt; [:before_save, :string] }, :unless =&gt; 'no'
+  before_save Proc.new { |r| r.history &lt;&lt; &quot;b00m&quot; }, :unless =&gt; 'yes'
+  # Array with conditions
+  before_save Proc.new { |r| r.history &lt;&lt; [:before_save, :symbol_array] }, :if =&gt; [:yes, :other_yes]
+  before_save Proc.new { |r| r.history &lt;&lt; &quot;b00m&quot; }, :if =&gt; [:yes, :no]
+  before_save Proc.new { |r| r.history &lt;&lt; [:before_save, :symbol_array] }, :unless =&gt; [:no, :other_no]
+  before_save Proc.new { |r| r.history &lt;&lt; &quot;b00m&quot; }, :unless =&gt; [:yes, :no]
+  # Combined if and unless
+  before_save Proc.new { |r| r.history &lt;&lt; [:before_save, :combined_symbol] }, :if =&gt; :yes, :unless =&gt; :no
+  before_save Proc.new { |r| r.history &lt;&lt; &quot;b00m&quot; }, :if =&gt; :yes, :unless =&gt; :yes
+  # Array with different types of conditions
+  before_save Proc.new { |r| r.history &lt;&lt; [:before_save, :symbol_proc_string_array] }, :if =&gt; [:yes, Proc.new { |r| true }, 'yes']
+  before_save Proc.new { |r| r.history &lt;&lt; &quot;b00m&quot; }, :if =&gt; [:yes, Proc.new { |r| true }, 'no']
+  # Array with different types of conditions comibned if and unless
+  before_save Proc.new { |r| r.history &lt;&lt; [:before_save, :combined_symbol_proc_string_array] },
+              :if =&gt; [:yes, Proc.new { |r| true }, 'yes'], :unless =&gt; [:no, 'no']
+  before_save Proc.new { |r| r.history &lt;&lt; &quot;b00m&quot; }, :if =&gt; [:yes, Proc.new { |r| true }, 'no'], :unless =&gt; [:no, 'no']
+
+  def yes; true; end
+  def other_yes; true; end
+  def no; false; end
+  def other_no; false; end
 
   def save
     run_callbacks(:before_save)
@@ -90,7 +121,16 @@ class ConditionalCallbackTest &lt; Test::Unit::TestCase
     person.save
     assert_equal [
       [:before_save, :proc],
-      [:before_save, :proc]
+      [:before_save, :proc],
+      [:before_save, :symbol],
+      [:before_save, :symbol],
+      [:before_save, :string],
+      [:before_save, :string],
+      [:before_save, :symbol_array],
+      [:before_save, :symbol_array],
+      [:before_save, :combined_symbol],
+      [:before_save, :symbol_proc_string_array],
+      [:before_save, :combined_symbol_proc_string_array]
     ], person.history
   end
 end</diff>
      <filename>activesupport/test/callbacks_test.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>3b92b141fd0759476690a174d5e2f8f0f2d9f1b7</id>
    </parent>
  </parents>
  <author>
    <name>Joshua Peek</name>
    <login>josh</login>
    <email>josh@joshpeek.com</email>
  </author>
  <url>http://github.com/rails/rails/commit/1e45818a622405e720a4529795f8be2f11660361</url>
  <id>1e45818a622405e720a4529795f8be2f11660361</id>
  <committed-date>2008-12-28T13:07:17-08:00</committed-date>
  <authored-date>2008-12-28T13:07:17-08:00</authored-date>
  <message>Allow multiple conditions for callbacks [#1627 state:resolved]</message>
  <tree>051a3175e52fedbcba931010852734f1e33839bc</tree>
  <committer>
    <name>Joshua Peek</name>
    <login>josh</login>
    <email>josh@joshpeek.com</email>
  </committer>
</commit>
