首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当使用build对象获取集合时,将生成对象追加到集合

当使用build对象获取集合时,将生成对象追加到集合
EN

Stack Overflow用户
提问于 2016-01-20 06:55:34
回答 2查看 44关注 0票数 0

Rails 4.2.4和Ruby 2.2.3

两种模式相关联如下:

代码语言:javascript
复制
class User < ActiveRecord::Base
  has_many :documents

  accepts_nested_attributes_for :documents
end

class Document < ActiveRecord::Base
  belongs_to :user
end

用户控制器的操作如下:

代码语言:javascript
复制
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变量具有以下值之后:

代码语言:javascript
复制
[#<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变量具有如下值之后:

代码语言:javascript
复制
[#<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以只获取文档的集合。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-20 08:34:17

@documents = @user.documents@user.documents数组添加一个引用。@user.documents.build会对数组进行适当的变异,所以@documents总是会显示新的记录。

您有两个解决此问题的选项:

@document初始化为Document,并手动设置外键,而不是遍历@documents。这不会将新记录添加到@user.documents中。

代码语言:javascript
复制
@documents = @user.documents
@document = Document.new(user: @user)

使用documents来复制#dup数组,而不是引用它。

代码语言:javascript
复制
@documents = @user.documents.dup
@document = @user.documents.build
票数 1
EN

Stack Overflow用户

发布于 2016-01-20 07:08:26

@documents指向@user的文档,您应该在@user上构建新的document,而不是@member,以便在@documents集合中查看新构建的文档。

更新edit操作如下所示,将显示@user的三个文档以及@document上新建的文档

代码语言:javascript
复制
class MembersController < ApplicationController
   def edit
    @user = User.find(params[:id])
    @documents = @user.documents   # List document
    @document =  @documents.build   # Build document on `@user`.
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34893378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档