Skip to content

Commit

Permalink
Add block syntax to HasManyAssociation#build. [#502 state:resolve]
Browse files Browse the repository at this point in the history
Signed-off-by: Pratik Naik <pratiknaik@gmail.com>
  • Loading branch information
jasondew authored and lifo committed Jul 14, 2008
1 parent d72c665 commit c6f397c
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 3 deletions.
Expand Up @@ -78,11 +78,14 @@ def reset
@loaded = false
end

def build(attributes = {})
def build(attributes = {}, &block)
if attributes.is_a?(Array)
attributes.collect { |attr| build(attr) }
attributes.collect { |attr| build(attr, &block) }
else
build_record(attributes) { |record| set_belongs_to_association_for(record) }
build_record(attributes) do |record|
block.call(record) if block_given?
set_belongs_to_association_for(record)
end
end
end

Expand Down
31 changes: 31 additions & 0 deletions activerecord/test/cases/associations/has_many_associations_test.rb
Expand Up @@ -425,6 +425,37 @@ def test_build_without_loading_association
assert_equal 2, first_topic.replies.to_ary.size
end

def test_build_via_block
company = companies(:first_firm)
new_client = assert_no_queries { company.clients_of_firm.build {|client| client.name = "Another Client" } }
assert !company.clients_of_firm.loaded?

assert_equal "Another Client", new_client.name
assert new_client.new_record?
assert_equal new_client, company.clients_of_firm.last
company.name += '-changed'
assert_queries(2) { assert company.save }
assert !new_client.new_record?
assert_equal 2, company.clients_of_firm(true).size
end

def test_build_many_via_block
company = companies(:first_firm)
new_clients = assert_no_queries do
company.clients_of_firm.build([{"name" => "Another Client"}, {"name" => "Another Client II"}]) do |client|
client.name = "changed"
end
end

assert_equal 2, new_clients.size
assert_equal "changed", new_clients.first.name
assert_equal "changed", new_clients.last.name

company.name += '-changed'
assert_queries(3) { assert company.save }
assert_equal 3, company.clients_of_firm(true).size
end

def test_create_without_loading_association
first_firm = companies(:first_firm)
Firm.column_names
Expand Down

0 comments on commit c6f397c

Please sign in to comment.