Performance: cache/reload arel relation when possible to speed up things.

This commit is contained in:
Emilio Tagua 2009-07-21 23:01:26 -03:00
parent 5123a2359b
commit ca1e62f142
2 changed files with 7 additions and 6 deletions

View File

@ -2602,7 +2602,7 @@ module ActiveRecord #:nodoc:
# be made (since they can't be persisted). # be made (since they can't be persisted).
def destroy def destroy
unless new_record? unless new_record?
arel_table.where(arel_table[self.class.primary_key].eq(id)).delete arel_table(true).where(arel_table[self.class.primary_key].eq(id)).delete
end end
freeze freeze
@ -2904,7 +2904,7 @@ module ActiveRecord #:nodoc:
def update(attribute_names = @attributes.keys) def update(attribute_names = @attributes.keys)
attributes_with_values = arel_attributes_values(false, false, attribute_names) attributes_with_values = arel_attributes_values(false, false, attribute_names)
return 0 if attributes_with_values.empty? return 0 if attributes_with_values.empty?
arel_table.where(arel_table[self.class.primary_key].eq(id)).update(attributes_with_values) arel_table(true).where(arel_table[self.class.primary_key].eq(id)).update(attributes_with_values)
end end
# Creates a record with values matching those of the instance attributes # Creates a record with values matching those of the instance attributes
@ -2991,8 +2991,9 @@ module ActiveRecord #:nodoc:
default default
end end
def arel_table def arel_table(reload = nil)
@arel_table = Arel::Table.new(self.class.table_name) @arel_table = Relation.new(self, self.class.table_name) if reload || @arel_table.nil?
@arel_table
end end
# Returns a copy of the attributes hash where all the values have been safely quoted for use in # Returns a copy of the attributes hash where all the values have been safely quoted for use in

View File

@ -89,7 +89,7 @@ module ActiveRecord
attribute_names.uniq! attribute_names.uniq!
begin begin
affected_rows = arel_table.where( affected_rows = arel_table(true).where(
arel_table[self.class.primary_key].eq(quoted_id).and( arel_table[self.class.primary_key].eq(quoted_id).and(
arel_table[self.class.locking_column].eq(quote_value(previous_value)) arel_table[self.class.locking_column].eq(quote_value(previous_value))
) )
@ -116,7 +116,7 @@ module ActiveRecord
lock_col = self.class.locking_column lock_col = self.class.locking_column
previous_value = send(lock_col).to_i previous_value = send(lock_col).to_i
affected_rows = arel_table.where( affected_rows = arel_table(true).where(
arel_table[self.class.primary_key].eq(quoted_id).and( arel_table[self.class.primary_key].eq(quoted_id).and(
arel_table[self.class.locking_column].eq(quote_value(previous_value)) arel_table[self.class.locking_column].eq(quote_value(previous_value))
) )