From ca1e62f14219da3990bb354d4a363dbe6fa13435 Mon Sep 17 00:00:00 2001 From: Emilio Tagua Date: Tue, 21 Jul 2009 23:01:26 -0300 Subject: Performance: cache/reload arel relation when possible to speed up things. --- activerecord/lib/active_record/base.rb | 9 +++++---- activerecord/lib/active_record/locking/optimistic.rb | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 2375211577..7a34e345a2 100755 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -2602,7 +2602,7 @@ module ActiveRecord #:nodoc: # be made (since they can't be persisted). def destroy 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 freeze @@ -2904,7 +2904,7 @@ module ActiveRecord #:nodoc: def update(attribute_names = @attributes.keys) attributes_with_values = arel_attributes_values(false, false, attribute_names) 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 # Creates a record with values matching those of the instance attributes @@ -2991,8 +2991,9 @@ module ActiveRecord #:nodoc: default end - def arel_table - @arel_table = Arel::Table.new(self.class.table_name) + def arel_table(reload = nil) + @arel_table = Relation.new(self, self.class.table_name) if reload || @arel_table.nil? + @arel_table end # Returns a copy of the attributes hash where all the values have been safely quoted for use in diff --git a/activerecord/lib/active_record/locking/optimistic.rb b/activerecord/lib/active_record/locking/optimistic.rb index bc22c2a511..4e833ec871 100644 --- a/activerecord/lib/active_record/locking/optimistic.rb +++ b/activerecord/lib/active_record/locking/optimistic.rb @@ -89,7 +89,7 @@ module ActiveRecord attribute_names.uniq! 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.locking_column].eq(quote_value(previous_value)) ) @@ -116,7 +116,7 @@ module ActiveRecord lock_col = self.class.locking_column 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.locking_column].eq(quote_value(previous_value)) ) -- cgit v1.2.3