Skip to content

Commit

Permalink
Added block-setting of attributes for Base.create like Base.new alrea…
Browse files Browse the repository at this point in the history
…dy has (Adam Meehan) [#39 state:resolved]
  • Loading branch information
dhh committed May 1, 2008
1 parent c83f758 commit dd120ed
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 4 deletions.
2 changes: 2 additions & 0 deletions activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*

* Added block-setting of attributes for Base.create like Base.new already has (Adam Meehan) [#39]

* Fixed that pessimistic locking you reference the quoted table name (Josh Susser) [#67]

* Fixed that change_column should be able to use :null => true on a field that formerly had false [Nate Wiger] [#26]
Expand Down
16 changes: 14 additions & 2 deletions activerecord/lib/active_record/base.rb
Expand Up @@ -603,13 +603,25 @@ def exists?(id_or_conditions)
# ==== Examples
# # Create a single new object
# User.create(:first_name => 'Jamie')
#
# # Create an Array of new objects
# User.create([{:first_name => 'Jamie'}, {:first_name => 'Jeremy'}])
def create(attributes = nil)
#
# # Create a single object and pass it into a block to set other attributes.
# User.create(:first_name => 'Jamie') do |u|
# u.is_admin = false
# end
#
# # Creating an Array of new objects using a block, where the block is executed for each object:
# User.create([{:first_name => 'Jamie'}, {:first_name => 'Jeremy'}]) do |u|
# u.is_admin = false
# end
def create(attributes = nil, &block)
if attributes.is_a?(Array)
attributes.collect { |attr| create(attr) }
attributes.collect { |attr| create(attr, &block) }
else
object = new(attributes)
yield(object) if block_given?
object.save
object
end
Expand Down
5 changes: 3 additions & 2 deletions activerecord/lib/active_record/validations.rb
Expand Up @@ -873,11 +873,12 @@ def validates_numericality_of(*attr_names)

# Creates an object just like Base.create but calls save! instead of save
# so an exception is raised if the record is invalid.
def create!(attributes = nil)
def create!(attributes = nil, &block)
if attributes.is_a?(Array)
attributes.collect { |attr| create!(attr) }
attributes.collect { |attr| create!(attr, &block) }
else
object = new(attributes)
yield(object) if block_given?
object.save!
object
end
Expand Down
21 changes: 21 additions & 0 deletions activerecord/test/cases/base_test.rb
Expand Up @@ -251,6 +251,27 @@ def test_create_through_factory
topic = Topic.create("title" => "New Topic")
topicReloaded = Topic.find(topic.id)
assert_equal(topic, topicReloaded)
end

def test_create_through_factory_with_block
topic = Topic.create("title" => "New Topic") do |t|
t.author_name = "David"
end
topicReloaded = Topic.find(topic.id)
assert_equal("New Topic", topic.title)
assert_equal("David", topic.author_name)
end

def test_create_many_through_factory_with_block
topics = Topic.create([ { "title" => "first" }, { "title" => "second" }]) do |t|
t.author_name = "David"
end
assert_equal 2, topics.size
topic1, topic2 = Topic.find(topics[0].id), Topic.find(topics[1].id)
assert_equal "first", topic1.title
assert_equal "David", topic1.author_name
assert_equal "second", topic2.title
assert_equal "David", topic2.author_name
end

def test_update
Expand Down
16 changes: 16 additions & 0 deletions activerecord/test/cases/validations_test.rb
Expand Up @@ -133,6 +133,22 @@ def test_exception_on_create_bang_many
Reply.create!([ { "title" => "OK" }, { "title" => "Wrong Create" }])
end
end

def test_exception_on_create_bang_with_block
assert_raises(ActiveRecord::RecordInvalid) do
Reply.create!({ "title" => "OK" }) do |r|
r.content = nil
end
end
end

def test_exception_on_create_bang_many_with_block
assert_raises(ActiveRecord::RecordInvalid) do
Reply.create!([{ "title" => "OK" }, { "title" => "Wrong Create" }]) do |r|
r.content = nil
end
end
end

def test_scoped_create_without_attributes
Reply.with_scope(:create => {}) do
Expand Down

0 comments on commit dd120ed

Please sign in to comment.