added an alias for new to build to the AR collection proxy, this corrects an issue where the collection proxies were not consistent

This commit is contained in:
Josh Kalderimis 2011-06-01 00:42:02 +02:00 committed by Jon Leighton
parent 1f34a79373
commit eb7ef2ccd6
4 changed files with 27 additions and 10 deletions

@ -56,6 +56,8 @@ def initialize(association)
Array.wrap(association.options[:extend]).each { |ext| proxy_extend(ext) }
end
alias_method :new, :build
def respond_to?(*args)
super ||
(load_target && target.respond_to?(*args)) ||
@ -115,14 +117,6 @@ def reload
@association.reload
self
end
def new(*args, &block)
if @association.is_a?(HasManyThroughAssociation)
@association.build(*args, &block)
else
method_missing(:new, *args, &block)
end
end
end
end
end

@ -6,8 +6,6 @@ module Associations
class HasManyThroughAssociation < HasManyAssociation #:nodoc:
include ThroughAssociation
alias_method :new, :build
# Returns the size of the collection by executing a SELECT COUNT(*) query if the collection hasn't been
# loaded and calling collection.size if it has. If it's more likely than not that the collection does
# have a size larger than zero, and you need to fetch that collection afterwards, it'll take one fewer

@ -245,6 +245,21 @@ def test_build
assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated
end
def test_new_aliased_to_build
devel = Developer.find(1)
proj = assert_no_queries { devel.projects.new("name" => "Projekt") }
assert !devel.projects.loaded?
assert_equal devel.projects.last, proj
assert devel.projects.loaded?
assert !proj.persisted?
devel.save
assert proj.persisted?
assert_equal devel.projects.last, proj
assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated
end
def test_build_by_new_record
devel = Developer.new(:name => "Marcel", :salary => 75000)
devel.projects.build(:name => "Make bed")

@ -537,6 +537,16 @@ def test_adding_a_collection
assert_equal 3, companies(:first_firm).clients_of_firm(true).size
end
def test_new_aliased_to_build
company = companies(:first_firm)
new_client = assert_no_queries { company.clients_of_firm.new("name" => "Another Client") }
assert !company.clients_of_firm.loaded?
assert_equal "Another Client", new_client.name
assert !new_client.persisted?
assert_equal new_client, company.clients_of_firm.last
end
def test_build
company = companies(:first_firm)
new_client = assert_no_queries { company.clients_of_firm.build("name" => "Another Client") }