mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Added option for passing an array to the find_all version of the dynamic finders and have it evaluated as an IN fragment
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1266 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
a080b1a231
commit
5f77f64e92
3 changed files with 18 additions and 1 deletions
|
@ -1,5 +1,10 @@
|
|||
*SVN*
|
||||
|
||||
* Added option for passing an array to the find_all version of the dynamic finders and have it evaluated as an IN fragment. Example:
|
||||
|
||||
# SELECT * FROM topics WHERE title IN ('First', 'Second')
|
||||
Topic.find_all_by_title(["First", "Second"])
|
||||
|
||||
* Added compatibility with camelCase column names for dynamic finders #533 [Dee.Zsombor]
|
||||
|
||||
* Fixed extraneous comma in count() function that made it not work with joins #1156 [jarkko/Dee.Zsombor]
|
||||
|
|
|
@ -787,7 +787,7 @@ module ActiveRecord #:nodoc:
|
|||
attributes.each { |attr_name| super unless column_methods_hash[attr_name.intern] }
|
||||
|
||||
attr_index = -1
|
||||
conditions = attributes.collect { |attr_name| attr_index += 1; "#{attr_name} #{arguments[attr_index].nil? ? "IS" : "="} ? " }.join(" AND ")
|
||||
conditions = attributes.collect { |attr_name| attr_index += 1; "#{attr_name} #{attribute_condition(arguments[attr_index])} " }.join(" AND ")
|
||||
|
||||
if arguments[attributes.length].is_a?(Hash)
|
||||
find(finder, { :conditions => [conditions, *arguments[0...attributes.length]]}.merge(arguments[attributes.length]))
|
||||
|
@ -800,6 +800,14 @@ module ActiveRecord #:nodoc:
|
|||
end
|
||||
end
|
||||
|
||||
def attribute_condition(argument)
|
||||
case argument
|
||||
when nil then "IS ?"
|
||||
when Array then "IN (?)"
|
||||
else "= ?"
|
||||
end
|
||||
end
|
||||
|
||||
# Defines an "attribute" method (like #inheritance_column or
|
||||
# #table_name). A new (class) method will be created with the
|
||||
# given name. If a value is specified, the new method will
|
||||
|
|
|
@ -211,6 +211,10 @@ class FinderTest < Test::Unit::TestCase
|
|||
assert @topics["first"].find, topics.first
|
||||
end
|
||||
|
||||
def test_find_all_by_array_attribute
|
||||
assert_equal 2, Topic.find_all_by_title(["The First Topic", "The Second Topic's of the day"]).size
|
||||
end
|
||||
|
||||
def test_find_all_by_boolean_attribute
|
||||
topics = Topic.find_all_by_approved(false)
|
||||
assert_equal 1, topics.size
|
||||
|
|
Loading…
Reference in a new issue