mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
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:
parent
1f34a79373
commit
eb7ef2ccd6
4 changed files with 27 additions and 10 deletions
|
@ -56,6 +56,8 @@ module ActiveRecord
|
|||
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 @@ module ActiveRecord
|
|||
@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 ActiveRecord
|
|||
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 @@ class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
|
|||
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 @@ class HasManyAssociationsTest < ActiveRecord::TestCase
|
|||
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") }
|
||||
|
|
Loading…
Reference in a new issue