Rails 4.2.4和Ruby 2.2.3
两种模式相关联如下:
class User < ActiveRecord::Base
has_many :documents
accepts_nested_attributes_for :documents
end
class Document < ActiveRecord::Base
belongs_to :user
end用户控制器的操作如下:
class UsersController < ApplicationController
def edit
@user = User.find(params[:id])
@documents = @user.documents # List document
@document = @user.documents.build # Build document
end
end在这里,我希望@documents变量只包含用户文档的集合。但是它还附加了一个新的Document #<Document:0x007f2d28431550 id: nil, name: nil, created_at: nil, updated_at: nil, user_id: 2>实例,我不想要这个实例。
假设一个@user有两个与它相关的文档。就在List Document步骤@documents变量具有以下值之后:
[#<Document:0x007f2d290b67d0
id: 95,
document: "doc1.pdf",
created_at: Wed, 20 Jan 2016 04:32:16 UTC +00:00,
updated_at: Wed, 20 Jan 2016 04:32:16 UTC +00:00,
user_id: 2>,
#<Document:0x008f8d290e87da
id: 96,
document: "doc2.pdf",
created_at: Wed, 20 Jan 2016 04:32:22 UTC +00:00,
updated_at: Wed, 20 Jan 2016 04:32:22 UTC +00:00,
user_id: 2>]和@documents.count = 2
但是,在Build document步骤@documents变量具有如下值之后:
[#<Document:0x007f2d290b67d0
id: 95,
document: "doc1.pdf",
created_at: Wed, 20 Jan 2016 04:32:16 UTC +00:00,
updated_at: Wed, 20 Jan 2016 04:32:16 UTC +00:00,
user_id: 2>,
#<Document:0x008f8d290e87da
id: 96,
document: "doc2.pdf",
created_at: Wed, 20 Jan 2016 04:32:22 UTC +00:00,
updated_at: Wed, 20 Jan 2016 04:32:22 UTC +00:00,
user_id: 2>,
#<Document:0x007f2d28431550 id: nil, name: nil, created_at: nil, updated_at: nil, user_id: 2> ]但我们还有@documents.count = 2。
在这里,count是一样的。但是集合包含另一个对象。我如何理解rails的这种行为。此外,我还可以冻结@documents以只获取文档的集合。
发布于 2016-01-20 08:34:17
@documents = @user.documents向@user.documents数组添加一个引用。@user.documents.build会对数组进行适当的变异,所以@documents总是会显示新的记录。
您有两个解决此问题的选项:
将@document初始化为Document,并手动设置外键,而不是遍历@documents。这不会将新记录添加到@user.documents中。
@documents = @user.documents
@document = Document.new(user: @user)使用documents来复制#dup数组,而不是引用它。
@documents = @user.documents.dup
@document = @user.documents.build发布于 2016-01-20 07:08:26
@documents指向@user的文档,您应该在@user上构建新的document,而不是@member,以便在@documents集合中查看新构建的文档。
更新edit操作如下所示,将显示@user的三个文档以及@document上新建的文档
class MembersController < ApplicationController
def edit
@user = User.find(params[:id])
@documents = @user.documents # List document
@document = @documents.build # Build document on `@user`.
end
endhttps://stackoverflow.com/questions/34893378
复制相似问题