提交 b9399c47 编写于 作者: Y Yves Senn

deal with `#append` and `#prepend` on association collections.

Closes #7364.

Collection associations behave similar to Arrays. However there is no
way to prepend records. And to append one should use `<<`. Before this
patch `#append` and `#prepend` did not add the record to the loaded
association.

`#append` now behaves like `<<` and `#prepend` is not defined.
上级 ce7133bf
## Rails 4.0.0 (unreleased) ##
* The `#append` method for collection associations behaves like`<<`.
`#prepend` is not defined and `<<` or `#append` should be used.
Fixes #7364.
*Yves Senn*
* Added support for creating a table via Rails migration generator.
For example,
For example,
rails g migration create_books title:string content:text
will generate a migration that creates a table called books with
the listed attributes, without creating a model.
will generate a migration that creates a table called books with
the listed attributes, without creating a model.
*Sammy Larbi*
......@@ -372,7 +378,7 @@
deprecated and removed in future versions of Rails.
*Amparo Luna + Guillermo Iguaran*
* `after_commit` and `after_rollback` now validate the `:on` option and raise an `ArgumentError`
if it is not one of `:create`, `:destroy` or `:update`
......
......@@ -947,6 +947,11 @@ def <<(*records)
proxy_association.concat(records) && self
end
alias_method :push, :<<
alias_method :append, :<<
def prepend(*args)
raise NoMethodError, "prepend on association is not defined. Please use << or append"
end
# Equivalent to +delete_all+. The difference is that returns +self+, instead
# of an array with the deleted objects, so methods can be chained. See
......
......@@ -172,6 +172,18 @@ def test_push_does_not_lose_additions_to_new_record
assert_equal 1, josh.posts.size
end
def test_append_behaves_like_push
josh = Author.new(:name => "Josh")
josh.posts.append Post.new(:title => "New on Edge", :body => "More cool stuff!")
assert josh.posts.loaded?
assert_equal 1, josh.posts.size
end
def test_prepend_is_not_defined
josh = Author.new(:name => "Josh")
assert_raises(NoMethodError) { josh.posts.prepend Post.new }
end
def test_save_on_parent_does_not_load_target
david = developers(:david)
......@@ -291,7 +303,7 @@ def test_has_one_association_redefinition_reflections_should_differ_and_not_inhe
end
def test_requires_symbol_argument
assert_raises ArgumentError do
assert_raises ArgumentError do
Class.new(Post) do
belongs_to "author"
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册