Permalink
Browse files

Merge pull request #5267 from kennyj/fix_4674

Fix GH #4674. Reset column information and sequence name when setting table_name.
  • Loading branch information...
2 parents b839657 + 200d994 commit 2fdb5219fb70a6368602c9d6073be8fa70b720fa @jonleighton jonleighton committed Mar 4, 2012
Showing with 38 additions and 5 deletions.
  1. +14 −5 activerecord/lib/active_record/model_schema.rb
  2. +24 −0 activerecord/test/cases/base_test.rb
View
19 activerecord/lib/active_record/model_schema.rb
@@ -114,10 +114,17 @@ def table_name
# You can also just define your own <tt>self.table_name</tt> method; see
# the documentation for ActiveRecord::Base#table_name.
def table_name=(value)
- @table_name = value && value.to_s
- @quoted_table_name = nil
- @arel_table = nil
- @relation = Relation.new(self, arel_table)
+ value = value && value.to_s
+ if defined?(@table_name)
+ return if value == @table_name
+
+ reset_column_information
+ end
+ @table_name = value
+ @quoted_table_name = nil
+ @arel_table = nil
+ @sequence_name = nil unless defined?(@explicitly_sequence_name) && @explicitly_sequence_name
+ @relation = Relation.new(self, arel_table)
end
# Returns a quoted version of the table name, used to construct SQL statements.
@@ -163,7 +170,8 @@ def sequence_name
end
def reset_sequence_name #:nodoc:
- self.sequence_name = connection.default_sequence_name(table_name, primary_key)
+ @sequence_name = connection.default_sequence_name(table_name, primary_key)
+ @explicitly_sequence_name = false
end
# Sets the name of the sequence to use when generating ids to the given
@@ -182,6 +190,7 @@ def reset_sequence_name #:nodoc:
# end
def sequence_name=(value)
@sequence_name = value.to_s
+ @explicitly_sequence_name = true
end
# Indicates whether the table associated with this class exists
View
24 activerecord/test/cases/base_test.rb
@@ -1479,6 +1479,30 @@ def test_switching_between_table_name
end
end
+ def test_clear_cash_when_setting_table_name
+ Joke.table_name = "cold_jokes"
+ before_columns = Joke.columns
+ before_seq = Joke.sequence_name
+
+ Joke.table_name = "funny_jokes"
+ after_columns = Joke.columns
+ after_seq = Joke.sequence_name
+
+ assert_not_equal before_columns, after_columns
+ assert_not_equal before_seq, after_seq unless before_seq.blank? && after_seq.blank?
+ end
+
+ def test_dont_clear_sequence_name_when_setting_explicitly
+ Joke.sequence_name = "black_jokes_seq"
+ Joke.table_name = "cold_jokes"
+ before_seq = Joke.sequence_name
+
+ Joke.table_name = "funny_jokes"
+ after_seq = Joke.sequence_name
+
+ assert_equal before_seq, after_seq unless before_seq.blank? && after_seq.blank?
+ end
+
def test_set_table_name_symbol_converted_to_string
Joke.table_name = :cold_jokes
assert_equal 'cold_jokes', Joke.table_name

0 comments on commit 2fdb521

Please sign in to comment.