Permalink
Browse files

Added option for passing an array to the find_all version of the dyna…

…mic 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
  • Loading branch information...
1 parent a080b1a commit 5f77f64e924e0e40f5f141dd38df5d54335b7a46 @dhh dhh committed May 2, 2005
Showing with 18 additions and 1 deletion.
  1. +5 −0 activerecord/CHANGELOG
  2. +9 −1 activerecord/lib/active_record/base.rb
  3. +4 −0 activerecord/test/finder_test.rb
View
@@ -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 @@ def method_missing(method_id, *arguments)
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 @@ def method_missing(method_id, *arguments)
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 @@ def test_find_all_by_one_attribute_with_options
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

0 comments on commit 5f77f64

Please sign in to comment.