Added block-setting of attributes for Base.create like Base.new already has (Adam Meehan) [#39 state:resolved]
This commit is contained in:
parent
c83f75812e
commit
dd120ede53
|
@ -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]
|
||||
|
|
|
@ -603,13 +603,25 @@ module ActiveRecord #:nodoc:
|
|||
# ==== 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
|
||||
|
|
|
@ -873,11 +873,12 @@ module ActiveRecord
|
|||
|
||||
# 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
|
||||
|
|
|
@ -253,6 +253,27 @@ class BasicsTest < ActiveRecord::TestCase
|
|||
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
|
||||
topic = Topic.new
|
||||
topic.title = "Another New Topic"
|
||||
|
|
|
@ -134,6 +134,22 @@ class ValidationsTest < ActiveRecord::TestCase
|
|||
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
|
||||
assert_raises(ActiveRecord::RecordInvalid) { Reply.create! }
|
||||
|
|
Loading…
Reference in New Issue