From 304d38c0536dc32a8a1595ba34370ebf69a0d50d Mon Sep 17 00:00:00 2001
From: Santiago Pastorino <santiago@wyeworks.com>
Date: Tue, 28 Dec 2010 00:45:35 -0200
Subject: Allow primary_key to be an attribute when the model is a new record

---
 activerecord/lib/active_record/persistence.rb     | 2 +-
 activerecord/lib/active_record/transactions.rb    | 4 ++--
 activerecord/test/cases/attribute_methods_test.rb | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

(limited to 'activerecord')

diff --git a/activerecord/lib/active_record/persistence.rb b/activerecord/lib/active_record/persistence.rb
index 9ac8fcb176..1fc9472231 100644
--- a/activerecord/lib/active_record/persistence.rb
+++ b/activerecord/lib/active_record/persistence.rb
@@ -282,7 +282,7 @@ module ActiveRecord
     # that instances loaded from the database would.
     def attributes_from_column_definition
       Hash[self.class.columns.map do |column|
-        [column.name, column.default] unless column.name == self.class.primary_key
+        [column.name, column.default]
       end]
     end
   end
diff --git a/activerecord/lib/active_record/transactions.rb b/activerecord/lib/active_record/transactions.rb
index 443f318067..868f761a33 100644
--- a/activerecord/lib/active_record/transactions.rb
+++ b/activerecord/lib/active_record/transactions.rb
@@ -301,8 +301,8 @@ module ActiveRecord
     # Save the new record state and id of a record so it can be restored later if a transaction fails.
     def remember_transaction_record_state #:nodoc
       @_start_transaction_state ||= {}
+      @_start_transaction_state[:id] = id if has_attribute?(self.class.primary_key)
       unless @_start_transaction_state.include?(:new_record)
-        @_start_transaction_state[:id] = id if has_attribute?(self.class.primary_key)
         @_start_transaction_state[:new_record] = @new_record
       end
       unless @_start_transaction_state.include?(:destroyed)
@@ -329,7 +329,7 @@ module ActiveRecord
             @attributes = @attributes.dup if @attributes.frozen?
             @new_record = restore_state[:new_record]
             @destroyed  = restore_state[:destroyed]
-            if restore_state[:id]
+            if restore_state.has_key?(:id)
               self.id = restore_state[:id]
             else
               @attributes.delete(self.class.primary_key)
diff --git a/activerecord/test/cases/attribute_methods_test.rb b/activerecord/test/cases/attribute_methods_test.rb
index 8214815bde..e3cbae4a84 100644
--- a/activerecord/test/cases/attribute_methods_test.rb
+++ b/activerecord/test/cases/attribute_methods_test.rb
@@ -105,7 +105,7 @@ class AttributeMethodsTest < ActiveRecord::TestCase
 
   def test_read_attributes_before_type_cast
     category = Category.new({:name=>"Test categoty", :type => nil})
-    category_attrs = {"name"=>"Test categoty", "type" => nil, "categorizations_count" => nil}
+    category_attrs = {"name"=>"Test categoty", "id" => nil, "type" => nil, "categorizations_count" => nil}
     assert_equal category_attrs , category.attributes_before_type_cast
   end
 
-- 
cgit v1.2.3