提交 4b9e83af 编写于 作者: R Rafael França

Merge pull request #22877 from kamipo/refactor_case_sensitive_comparison

Refactor `case_{sensitive|insensitive}_comparison`
......@@ -391,19 +391,17 @@ def create_savepoint(name = nil)
def release_savepoint(name = nil)
end
def case_sensitive_modifier(node, table_attribute)
node
end
def case_sensitive_comparison(table, attribute, column, value)
table_attr = table[attribute]
value = case_sensitive_modifier(value, table_attr) unless value.nil?
table_attr.eq(value)
if value.nil?
table[attribute].eq(value)
else
table[attribute].eq(Arel::Nodes::BindParam.new)
end
end
def case_insensitive_comparison(table, attribute, column, value)
if can_perform_case_insensitive_comparison_for?(column)
table[attribute].lower.eq(table.lower(value))
table[attribute].lower.eq(table.lower(Arel::Nodes::BindParam.new))
else
case_sensitive_comparison(table, attribute, column, value)
end
......
......@@ -752,16 +752,11 @@ def primary_keys(table_name) # :nodoc:
SQL
end
def case_sensitive_modifier(node, table_attribute)
node = Arel::Nodes.build_quoted node, table_attribute
Arel::Nodes::Bin.new(node)
end
def case_sensitive_comparison(table, attribute, column, value)
if column.case_sensitive?
table[attribute].eq(value)
else
if value.nil? || column.case_sensitive?
super
else
table[attribute].eq(Arel::Nodes::Bin.new(Arel::Nodes::BindParam.new))
end
end
......@@ -769,7 +764,7 @@ def case_insensitive_comparison(table, attribute, column, value)
if column.case_sensitive?
super
else
table[attribute].eq(value)
table[attribute].eq(Arel::Nodes::BindParam.new)
end
end
......
......@@ -22,6 +22,7 @@ def build(opts, other)
parts = predicate_builder.build_from_hash(attributes)
when Arel::Nodes::Node
parts = [opts]
binds = other
else
raise ArgumentError, "Unsupported argument type: #{opts} (#{opts.class})"
end
......
......@@ -73,15 +73,18 @@ def build_relation(klass, table, attribute, value) #:nodoc:
value = value.to_s[0, column.limit]
end
value = Arel::Nodes::Quoted.new(value)
comparison = if !options[:case_sensitive] && !value.nil?
# will use SQL LOWER function before comparison, unless it detects a case insensitive collation
klass.connection.case_insensitive_comparison(table, attribute, column, value)
else
klass.connection.case_sensitive_comparison(table, attribute, column, value)
end
klass.unscoped.where(comparison)
if value.nil?
klass.unscoped.where(comparison)
else
bind = Relation::QueryAttribute.new(attribute.to_s, value, Type::Value.new)
klass.unscoped.where(comparison, bind)
end
rescue RangeError
klass.none
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册