aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/relation/predicate_builder.rb8
-rw-r--r--activerecord/lib/active_record/relation/predicate_builder/base_handler.rb10
-rw-r--r--activerecord/lib/active_record/relation/predicate_builder/basic_object_handler.rb9
-rw-r--r--activerecord/lib/active_record/relation/predicate_builder/class_handler.rb10
-rw-r--r--activerecord/lib/active_record/table_metadata.rb6
5 files changed, 37 insertions, 6 deletions
diff --git a/activerecord/lib/active_record/relation/predicate_builder.rb b/activerecord/lib/active_record/relation/predicate_builder.rb
index 65c4c11e64..fc2cc11c08 100644
--- a/activerecord/lib/active_record/relation/predicate_builder.rb
+++ b/activerecord/lib/active_record/relation/predicate_builder.rb
@@ -8,15 +8,15 @@ module ActiveRecord
require 'active_record/relation/predicate_builder/range_handler'
require 'active_record/relation/predicate_builder/relation_handler'
- delegate :resolve_column_aliases, to: :table
+ delegate :resolve_column_aliases, :type_cast_for_database, to: :table
def initialize(table)
@table = table
@handlers = []
- register_handler(BasicObject, BasicObjectHandler.new)
- register_handler(Class, ClassHandler.new)
- register_handler(Base, BaseHandler.new)
+ register_handler(BasicObject, BasicObjectHandler.new(self))
+ register_handler(Class, ClassHandler.new(self))
+ register_handler(Base, BaseHandler.new(self))
register_handler(Range, RangeHandler.new)
register_handler(Relation, RelationHandler.new)
register_handler(Array, ArrayHandler.new(self))
diff --git a/activerecord/lib/active_record/relation/predicate_builder/base_handler.rb b/activerecord/lib/active_record/relation/predicate_builder/base_handler.rb
index d50ea519f9..6fa5b16f73 100644
--- a/activerecord/lib/active_record/relation/predicate_builder/base_handler.rb
+++ b/activerecord/lib/active_record/relation/predicate_builder/base_handler.rb
@@ -1,9 +1,17 @@
module ActiveRecord
class PredicateBuilder
class BaseHandler # :nodoc:
+ def initialize(predicate_builder)
+ @predicate_builder = predicate_builder
+ end
+
def call(attribute, value)
- attribute.eq(value.id)
+ predicate_builder.build(attribute, value.id)
end
+
+ protected
+
+ attr_reader :predicate_builder
end
end
end
diff --git a/activerecord/lib/active_record/relation/predicate_builder/basic_object_handler.rb b/activerecord/lib/active_record/relation/predicate_builder/basic_object_handler.rb
index 79cde00303..57a8b63001 100644
--- a/activerecord/lib/active_record/relation/predicate_builder/basic_object_handler.rb
+++ b/activerecord/lib/active_record/relation/predicate_builder/basic_object_handler.rb
@@ -1,9 +1,18 @@
module ActiveRecord
class PredicateBuilder
class BasicObjectHandler # :nodoc:
+ def initialize(predicate_builder)
+ @predicate_builder = predicate_builder
+ end
+
def call(attribute, value)
+ value = predicate_builder.type_cast_for_database(attribute.name, value)
attribute.eq(value)
end
+
+ protected
+
+ attr_reader :predicate_builder
end
end
end
diff --git a/activerecord/lib/active_record/relation/predicate_builder/class_handler.rb b/activerecord/lib/active_record/relation/predicate_builder/class_handler.rb
index 3fe1642ed0..ed313fc9d4 100644
--- a/activerecord/lib/active_record/relation/predicate_builder/class_handler.rb
+++ b/activerecord/lib/active_record/relation/predicate_builder/class_handler.rb
@@ -1,11 +1,19 @@
module ActiveRecord
class PredicateBuilder
class ClassHandler # :nodoc:
+ def initialize(predicate_builder)
+ @predicate_builder = predicate_builder
+ end
+
def call(attribute, value)
print_deprecation_warning
- attribute.eq(value.name)
+ predicate_builder.build(attribute, value.name)
end
+ protected
+
+ attr_reader :predicate_builder
+
private
def print_deprecation_warning
diff --git a/activerecord/lib/active_record/table_metadata.rb b/activerecord/lib/active_record/table_metadata.rb
index bf705d3565..811e6964a9 100644
--- a/activerecord/lib/active_record/table_metadata.rb
+++ b/activerecord/lib/active_record/table_metadata.rb
@@ -8,6 +8,12 @@ module ActiveRecord
@association = association
end
+ def type_cast_for_database(attribute_name, value)
+ return value if value.is_a?(Arel::Nodes::BindParam) || klass.nil?
+ type = klass.type_for_attribute(attribute_name.to_s)
+ Arel::Nodes::Quoted.new(type.type_cast_for_database(value))
+ end
+
def resolve_column_aliases(hash)
hash = hash.dup
hash.keys.grep(Symbol) do |key|