From f956759f8ab656484add2d5bc6e8f6f4add79469 Mon Sep 17 00:00:00 2001 From: Les Fletcher Date: Thu, 21 Jul 2011 01:36:02 -0700 Subject: fix after_initialize edge case (close #2074 and close #2175) fix behavior when after_initialize is defined and a block is passed to Base.create --- activerecord/lib/active_record/base.rb | 3 +-- activerecord/test/cases/base_test.rb | 23 +++++++++++++++++++++++ activerecord/test/models/wholesale_product.rb | 13 +++++++++++++ activerecord/test/schema/schema.rb | 5 +++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 activerecord/test/models/wholesale_product.rb (limited to 'activerecord') diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 2c162a6fc8..4136868b39 100644 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -504,8 +504,7 @@ module ActiveRecord #:nodoc: if attributes.is_a?(Array) attributes.collect { |attr| create(attr, options, &block) } else - object = new(attributes, options) - yield(object) if block_given? + object = new(attributes, options, &block) object.save object end diff --git a/activerecord/test/cases/base_test.rb b/activerecord/test/cases/base_test.rb index 8b4e7dd799..934f0c8f74 100644 --- a/activerecord/test/cases/base_test.rb +++ b/activerecord/test/cases/base_test.rb @@ -21,6 +21,7 @@ require 'models/parrot' require 'models/person' require 'models/edge' require 'models/joke' +require 'models/wholesale_product' require 'rexml/document' require 'active_support/core_ext/exception' @@ -260,6 +261,28 @@ class BasicsTest < ActiveRecord::TestCase end end + def test_create_with_after_initialize + wp1 = WholesaleProduct.create(:msrp => 10) + assert_equal(10, wp1.msrp) + assert_equal(5, wp1.wholesale) + + wp2 = WholesaleProduct.create(:wholesale => 10) + assert_equal(20, wp2.msrp) + assert_equal(10, wp2.wholesale) + + wp3 = WholesaleProduct.create do |wp| + wp.msrp = 10 + end + assert_equal(10, wp3.msrp) + assert_equal(5, wp3.wholesale) + + wp4 = WholesaleProduct.create do |wp| + wp.wholesale = 10 + end + assert_equal(20, wp4.msrp) + assert_equal(10, wp4.wholesale) + end + def test_load topics = Topic.find(:all, :order => 'id') assert_equal(4, topics.size) diff --git a/activerecord/test/models/wholesale_product.rb b/activerecord/test/models/wholesale_product.rb new file mode 100644 index 0000000000..e1a1a4c8b1 --- /dev/null +++ b/activerecord/test/models/wholesale_product.rb @@ -0,0 +1,13 @@ +class WholesaleProduct < ActiveRecord::Base + + after_initialize :set_prices + + def set_prices + if msrp.nil? && !wholesale.nil? + self.msrp = 2 * wholesale + elsif !msrp.nil? && wholesale.nil? + self.wholesale = msrp / 2 + end + end + +end \ No newline at end of file diff --git a/activerecord/test/schema/schema.rb b/activerecord/test/schema/schema.rb index 64e0452100..d2a41ed87a 100644 --- a/activerecord/test/schema/schema.rb +++ b/activerecord/test/schema/schema.rb @@ -678,6 +678,11 @@ ActiveRecord::Schema.define do t.references :wheelable, :polymorphic => true end + create_table :wholesale_products, :force => true do |t| + t.integer :msrp + t.integer :wholesale + end + create_table :zines, :force => true do |t| t.string :title end -- cgit v1.2.3 From 6e3c0a5d9a22a4a08628b3f72a6b4072e0a23405 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Fri, 22 Jul 2011 18:43:27 -0400 Subject: simplify and be more explicit about create and after_initialize tests --- activerecord/test/cases/base_test.rb | 28 ++++++++++----------------- activerecord/test/models/wholesale_product.rb | 8 ++------ 2 files changed, 12 insertions(+), 24 deletions(-) (limited to 'activerecord') diff --git a/activerecord/test/cases/base_test.rb b/activerecord/test/cases/base_test.rb index 934f0c8f74..5a64a1163b 100644 --- a/activerecord/test/cases/base_test.rb +++ b/activerecord/test/cases/base_test.rb @@ -261,26 +261,18 @@ class BasicsTest < ActiveRecord::TestCase end end - def test_create_with_after_initialize - wp1 = WholesaleProduct.create(:msrp => 10) - assert_equal(10, wp1.msrp) - assert_equal(5, wp1.wholesale) - - wp2 = WholesaleProduct.create(:wholesale => 10) - assert_equal(20, wp2.msrp) - assert_equal(10, wp2.wholesale) - - wp3 = WholesaleProduct.create do |wp| - wp.msrp = 10 - end - assert_equal(10, wp3.msrp) - assert_equal(5, wp3.wholesale) + def test_create_after_initialize_without_block + wp = WholesaleProduct.create(:wholesale => 10) + assert_equal(20, wp.msrp) + assert_equal(10, wp.wholesale) + end - wp4 = WholesaleProduct.create do |wp| - wp.wholesale = 10 + def test_create_after_initialize_with_block + wp = WholesaleProduct.create do |w| + w.wholesale = 10 end - assert_equal(20, wp4.msrp) - assert_equal(10, wp4.wholesale) + assert_equal(20, wp.msrp) + assert_equal(10, wp.wholesale) end def test_load diff --git a/activerecord/test/models/wholesale_product.rb b/activerecord/test/models/wholesale_product.rb index e1a1a4c8b1..5c6c15391c 100644 --- a/activerecord/test/models/wholesale_product.rb +++ b/activerecord/test/models/wholesale_product.rb @@ -3,11 +3,7 @@ class WholesaleProduct < ActiveRecord::Base after_initialize :set_prices def set_prices - if msrp.nil? && !wholesale.nil? - self.msrp = 2 * wholesale - elsif !msrp.nil? && wholesale.nil? - self.wholesale = msrp / 2 - end + self.msrp = 2 * wholesale if wholesale end -end \ No newline at end of file +end -- cgit v1.2.3 From f5e4d13270dbce2bb880ef6529da68aaee017910 Mon Sep 17 00:00:00 2001 From: Gabriel Horner Date: Sun, 24 Jul 2011 16:36:06 -0400 Subject: use existing model for testing Base.create with #after_initialize --- activerecord/test/cases/base_test.rb | 16 +++++++--------- activerecord/test/models/bulb.rb | 5 +++++ activerecord/test/models/wholesale_product.rb | 9 --------- activerecord/test/schema/schema.rb | 5 ----- 4 files changed, 12 insertions(+), 23 deletions(-) delete mode 100644 activerecord/test/models/wholesale_product.rb (limited to 'activerecord') diff --git a/activerecord/test/cases/base_test.rb b/activerecord/test/cases/base_test.rb index 5a64a1163b..f2f5b73626 100644 --- a/activerecord/test/cases/base_test.rb +++ b/activerecord/test/cases/base_test.rb @@ -21,7 +21,7 @@ require 'models/parrot' require 'models/person' require 'models/edge' require 'models/joke' -require 'models/wholesale_product' +require 'models/bulb' require 'rexml/document' require 'active_support/core_ext/exception' @@ -262,17 +262,15 @@ class BasicsTest < ActiveRecord::TestCase end def test_create_after_initialize_without_block - wp = WholesaleProduct.create(:wholesale => 10) - assert_equal(20, wp.msrp) - assert_equal(10, wp.wholesale) + cb = CustomBulb.create(:name => 'Dude') + assert_equal('Dude', cb.name) + assert_equal(true, cb.frickinawesome) end def test_create_after_initialize_with_block - wp = WholesaleProduct.create do |w| - w.wholesale = 10 - end - assert_equal(20, wp.msrp) - assert_equal(10, wp.wholesale) + cb = CustomBulb.create {|c| c.name = 'Dude' } + assert_equal('Dude', cb.name) + assert_equal(true, cb.frickinawesome) end def test_load diff --git a/activerecord/test/models/bulb.rb b/activerecord/test/models/bulb.rb index efb98b66e7..888afc7604 100644 --- a/activerecord/test/models/bulb.rb +++ b/activerecord/test/models/bulb.rb @@ -33,4 +33,9 @@ class Bulb < ActiveRecord::Base end class CustomBulb < Bulb + after_initialize :set_awesomeness + + def set_awesomeness + self.frickinawesome = true if name == 'Dude' + end end diff --git a/activerecord/test/models/wholesale_product.rb b/activerecord/test/models/wholesale_product.rb deleted file mode 100644 index 5c6c15391c..0000000000 --- a/activerecord/test/models/wholesale_product.rb +++ /dev/null @@ -1,9 +0,0 @@ -class WholesaleProduct < ActiveRecord::Base - - after_initialize :set_prices - - def set_prices - self.msrp = 2 * wholesale if wholesale - end - -end diff --git a/activerecord/test/schema/schema.rb b/activerecord/test/schema/schema.rb index d2a41ed87a..64e0452100 100644 --- a/activerecord/test/schema/schema.rb +++ b/activerecord/test/schema/schema.rb @@ -678,11 +678,6 @@ ActiveRecord::Schema.define do t.references :wheelable, :polymorphic => true end - create_table :wholesale_products, :force => true do |t| - t.integer :msrp - t.integer :wholesale - end - create_table :zines, :force => true do |t| t.string :title end -- cgit v1.2.3