提交 4bc2ae0d 编写于 作者: A Aaron Patterson

use bind values for join columns

上级 a4e4d285
......@@ -33,6 +33,18 @@ def scope
private
def column_for(table_name, column_name)
columns = alias_tracker.connection.schema_cache.columns_hash[table_name]
columns[column_name]
end
def bind(scope, column, value)
substitute = alias_tracker.connection.substitute_at(
column, scope.bind_values.length)
scope.bind_values += [[column, value]]
substitute
end
def add_constraints(scope)
tables = construct_tables
......@@ -67,7 +79,10 @@ def add_constraints(scope)
conditions = self.conditions[i]
if reflection == chain.last
scope = scope.where(table[key].eq(owner[foreign_key]))
column = column_for(table.table_name, key.to_s)
bind_val = bind(scope, column, owner[foreign_key])
scope = scope.where(table[key].eq(bind_val))
#scope = scope.where(table[key].eq(owner[foreign_key]))
if reflection.type
scope = scope.where(table[reflection.type].eq(owner.class.base_class.name))
......
......@@ -20,14 +20,14 @@ def select_all(arel, name = nil, binds = [])
# Returns a record hash with the column names as keys and column values
# as values.
def select_one(arel, name = nil)
result = select_all(arel, name)
def select_one(arel, name = nil, binds = [])
result = select_all(arel, name, binds)
result.first if result
end
# Returns a single value from a record
def select_value(arel, name = nil)
if result = select_one(arel, name)
def select_value(arel, name = nil, binds = [])
if result = select_one(arel, name, binds)
result.values.first
end
end
......
......@@ -463,7 +463,12 @@ def where_values_hash
node.left.relation.name == table_name
}
Hash[equalities.map { |where| [where.left.name, where.right] }]
binds = Hash[bind_values.find_all(&:first).map { |column, v| [column.name, v] }]
Hash[equalities.map { |where|
name = where.left.name
[name, binds.fetch(name.to_s) { where.right }]
}]
end
def scope_for_create
......
......@@ -183,7 +183,7 @@ def pluck(column_name)
column_name = "#{table_name}.#{column_name}"
end
result = klass.connection.select_all(select(column_name).arel)
result = klass.connection.select_all(select(column_name).arel, nil, bind_values)
types = result.column_types.merge klass.column_types
column = types[key]
......@@ -254,7 +254,8 @@ def execute_simple_calculation(operation, column_name, distinct) #:nodoc:
query_builder = relation.arel
end
type_cast_calculated_value(@klass.connection.select_value(query_builder), column_for(column_name), operation)
result = @klass.connection.select_value(query_builder, nil, relation.bind_values)
type_cast_calculated_value(result, column_for(column_name), operation)
end
def execute_grouped_calculation(operation, column_name, distinct) #:nodoc:
......@@ -290,7 +291,7 @@ def execute_grouped_calculation(operation, column_name, distinct) #:nodoc:
relation = except(:group).group(group.join(','))
relation.select_values = select_values
calculated_data = @klass.connection.select_all(relation)
calculated_data = @klass.connection.select_all(relation, nil, bind_values)
if association
key_ids = calculated_data.collect { |row| row[group_aliases.first] }
......
......@@ -200,7 +200,7 @@ def exists?(id = false)
relation = relation.where(table[primary_key].eq(id)) if id
end
connection.select_value(relation, "#{name} Exists") ? true : false
connection.select_value(relation, "#{name} Exists", relation.bind_values) ? true : false
end
protected
......@@ -331,7 +331,7 @@ def find_one(id)
substitute = connection.substitute_at(column, @bind_values.length)
relation = where(table[primary_key].eq(substitute))
relation.bind_values = [[column, id]]
relation.bind_values += [[column, id]]
record = relation.first
unless record
......
......@@ -22,7 +22,7 @@ def merge(r)
end
end
(Relation::MULTI_VALUE_METHODS - [:joins, :where, :order]).each do |method|
(Relation::MULTI_VALUE_METHODS - [:joins, :where, :order, :binds]).each do |method|
value = r.send(:"#{method}_values")
next if value.empty?
......@@ -34,6 +34,8 @@ def merge(r)
merged_wheres = @where_values + r.where_values
merged_binds = (@bind_values + r.bind_values).uniq(&:first)
unless @where_values.empty?
# Remove duplicates, last one wins.
seen = Hash.new { |h,table| h[table] = {} }
......@@ -50,6 +52,7 @@ def merge(r)
end
merged_relation.where_values = merged_wheres
merged_relation.bind_values = merged_binds
(Relation::SINGLE_VALUE_METHODS - [:lock, :create_with, :reordering]).each do |method|
value = r.send(:"#{method}_value")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册