This patch extends _is and _is_not to support multiple values, just like
ActiveRecord's find.
names = %w{tablatom solars grayeed prh}
User.name_is(names)
User.state_is_not([:al, :la, :mi])
It's not pretty and it's not exhaustively tested but it does make my app a
little nicer.
ALSO, it doesn't support, transport_is(:train, :ship, :airplane). You must
write that as transport_is([:train, :ship, :airplane]). Fixing this means
making some deeper changes.
Is this patch good enough to go in? Maybe someone would want to fix that
last item and make User.name_is("Alice", "Bob") work?
- Scott
diff --git a/vendor/plugins/hobo/hobo/lib/hobo/scopes/automatic_scopes.rb
b/vendor/plugins/hobo/hobo/lib/hobo/scopes/automatic_scopes.rb
index 99ee76c..5eabb1f 100644
--- a/vendor/plugins/hobo/hobo/lib/hobo/scopes/automatic_scopes.rb
+++ b/vendor/plugins/hobo/hobo/lib/hobo/scopes/automatic_scopes.rb
@@ -84,12 +84,18 @@ module Hobo
if refl.options[:polymorphic]
def_scope do |record|
record = find_if_named(refl, record)
- { :conditions => ["#{foreign_key_column refl} = ? AND
#{$1}_type = ?", record, record.class.name] }
+ { :conditions => record.kind_of?(Enumerable) ?
+ ["#{foreign_key_column refl} IN (?) AND #{$1}_type = ?",
record, record.class.name] :
+ ["#{foreign_key_column refl} = ? AND #{$1}_type = ?",
record, record.class.name]
+ }
end
else
def_scope do |record|
record = find_if_named(refl, record)
- { :conditions => ["#{foreign_key_column refl} = ?", record] }
+ { :conditions => record.kind_of?(Enumerable) ?
+ ["#{foreign_key_column refl} IN (?)", record] :
+ ["#{foreign_key_column refl} = ?", record]
+ }
end
end
@@ -99,12 +105,18 @@ module Hobo
if refl.options[:polymorphic]
def_scope do |record|
record = find_if_named(refl, record)
- { :conditions => ["#{foreign_key_column refl} <> ? OR
#{name}_type <> ?", record, record.class.name] }
+ { :conditions => record.kind_of?(Enumerable) ?
+ ["#{foreign_key_column refl} NOT IN (?) OR #{name}_type <>
?", record, record.class.name] :
+ ["#{foreign_key_column refl} <> ? OR #{name}_type <> ?",
record, record.class.name]
+ }
end
else
def_scope do |record|
record = find_if_named(refl, record)
- { :conditions => ["#{foreign_key_column refl} <> ?", record]
}
+ { :conditions => record.kind_of?(Enumerable) ?
+ ["#{foreign_key_column refl} NOT IN (?)", record] :
+ ["#{foreign_key_column refl} <> ?", record]
+ }
end
end
@@ -114,15 +126,21 @@ module Hobo
# name_is(str)
elsif name =~ /^(.*)_is$/ && (col = column($1))
- def_scope do |str|
- { :conditions => ["#{column_sql(col)} = ?", str] }
+ def_scope do |key|
+ { :conditions => key.kind_of?(Enumerable) ?
+ ["#{column_sql(col)} IN (?)", key] :
+ ["#{column_sql(col)} = ?", key]
+ }
end
# name_is_not(str)
elsif name =~ /^(.*)_is_not$/ && (col = column($1))
- def_scope do |str|
- { :conditions => ["#{column_sql(col)} <> ?", str] }
+ def_scope do |key|
+ { :conditions => key.kind_of?(Enumerable) ?
+ ["#{column_sql(col)} NOT IN (?)", key] :
+ ["#{column_sql(col)} <> ?", key]
+ }
end
# name_contains(str)
@@ -213,13 +231,19 @@ module Hobo
elsif name == "is"
def_scope do |record|
- { :conditions => ["#[email protected]_name}.#{@klass.primary_key} =
?", record] }
+ { :conditions => record.kind_of?(Enumerable) ?
+ ["#[email protected]_name}.#{@klass.primary_key} IN (?)", record]
:
+ ["#[email protected]_name}.#{@klass.primary_key} = ?", record]
+ }
end
elsif name == "is_not"
def_scope do |record|
- { :conditions => ["#[email protected]_name}.#{@klass.primary_key}
<> ?", record] }
+ { :conditions => record.kind_of?(Enumerable) ?
+ ["#[email protected]_name}.#{@klass.primary_key} NOT IN (?)",
record] :
+ ["#[email protected]_name}.#{@klass.primary_key} <> ?", record]
+ }
end
else
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Hobo
Users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/hobousers?hl=en
-~----------~----~----~----~------~----~------~--~---