Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Supplying Arel::SqlLiteral is much faster

  • Loading branch information...
commit da142cd86584d56299470ee4dd6f90be7127b477 1 parent 378464a
@lifo lifo authored
View
7 activerecord/lib/active_record/relation.rb
@@ -282,8 +282,11 @@ def to_sql
def scope_for_create
@scope_for_create ||= begin
- @create_with_value || wheres.inject({}) do |hash, where|
- hash[where.operand1.name] = where.operand2.value if where.is_a?(Arel::Predicates::Equality)
+ @create_with_value || @where_values.inject({}) do |hash, where|
+ if where.is_a?(Arel::Predicates::Equality)
+ hash[where.operand1.name] = where.operand2.respond_to?(:value) ? where.operand2.value : where.operand2
+ end
+
hash
end
end
View
17 activerecord/lib/active_record/relation/query_methods.rb
@@ -119,8 +119,16 @@ def build_arel
end
end
- @where_values.uniq.each do |w|
- arel = w.is_a?(String) ? arel.where(w) : arel.where(*w)
+ @where_values.uniq.each do |where|
+ next if where.blank?
+
+ case where
+ when Arel::SqlLiteral
+ arel = arel.where(where)
+ else
+ sql = where.is_a?(String) ? where : where.to_sql
+ arel = arel.where(Arel::SqlLiteral.new("(#{sql})"))
+ end
end
@having_values.uniq.each do |h|
@@ -135,7 +143,7 @@ def build_arel
end
@order_values.uniq.each do |o|
- arel = arel.order(o) if o.present?
+ arel = arel.order(Arel::SqlLiteral.new(o.to_s)) if o.present?
end
selects = @select_values.uniq
@@ -169,8 +177,7 @@ def build_where(*args)
builder = PredicateBuilder.new(table.engine)
conditions = if [String, Array].include?(args.first.class)
- sql = @klass.send(:sanitize_sql, args.size > 1 ? args : args.first)
- Arel::SqlLiteral.new("(#{sql})") if sql.present?
+ @klass.send(:sanitize_sql, args.size > 1 ? args : args.first)
elsif args.first.is_a?(Hash)
attributes = @klass.send(:expand_hash_conditions_for_aggregates, args.first)
builder.build_from_hash(attributes, table)
Please sign in to comment.
Something went wrong with that request. Please try again.