Skip to content

Commit

Permalink
Merge pull request #2007 from amatsuda/having_vargs_nomethoderror_fix
Browse files Browse the repository at this point in the history
having() raises NoMethodError: undefined method `empty?' when the given argument does not respond to empty?
  • Loading branch information
spastorino committed Jul 9, 2011
2 parents 111968d + 7c921fb commit bc364af
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 8 deletions.
6 changes: 3 additions & 3 deletions activerecord/lib/active_record/relation/query_methods.rb
Expand Up @@ -96,11 +96,11 @@ def where(opts, *rest)
relation
end

def having(*args)
return self if args.blank?
def having(opts, *rest)
return self if opts.blank?

relation = clone
relation.having_values += build_where(*args)
relation.having_values += build_where(opts, rest)
relation
end

Expand Down
17 changes: 12 additions & 5 deletions activerecord/test/cases/finder_test.rb
Expand Up @@ -140,23 +140,30 @@ def test_find_all_with_limit_and_offset_and_multiple_order_clauses


def test_find_with_group
developers = Developer.find(:all, :group => "salary", :select => "salary")
developers = Developer.find(:all, :group => "salary", :select => "salary")
assert_equal 4, developers.size
assert_equal 4, developers.map(&:salary).uniq.size
end

def test_find_with_group_and_having
developers = Developer.find(:all, :group => "salary", :having => "sum(salary) > 10000", :select => "salary")
developers = Developer.find(:all, :group => "salary", :having => "sum(salary) > 10000", :select => "salary")
assert_equal 3, developers.size
assert_equal 3, developers.map(&:salary).uniq.size
assert developers.all? { |developer| developer.salary > 10000 }
assert developers.all? { |developer| developer.salary > 10000 }
end

def test_find_with_group_and_sanitized_having
developers = Developer.find(:all, :group => "salary", :having => ["sum(salary) > ?", 10000], :select => "salary")
developers = Developer.find(:all, :group => "salary", :having => ["sum(salary) > ?", 10000], :select => "salary")
assert_equal 3, developers.size
assert_equal 3, developers.map(&:salary).uniq.size
assert developers.all? { |developer| developer.salary > 10000 }
assert developers.all? { |developer| developer.salary > 10000 }
end

def test_find_with_group_and_sanitized_having_method
developers = Developer.group(:salary).having("sum(salary) > ?", 10000).select('salary').all
assert_equal 3, developers.size
assert_equal 3, developers.map(&:salary).uniq.size
assert developers.all? { |developer| developer.salary > 10000 }
end

def test_find_with_entire_select_statement
Expand Down

0 comments on commit bc364af

Please sign in to comment.