【问题标题】:Mongoid update_attributes creating new referenced documentMongoid update_attributes 创建新的引用文档
【发布时间】:2013-01-26 23:23:49
【问题描述】:

我在使用 update_attributes 和参考文档时遇到问题。我已经将我的问题简化为一个简单的例子,A​​FAICT 应该可以工作,但不能:

class Account
  include Mongoid::Document
  has_many :submissions, :autosave => true
end

class Submission
  include Mongoid::Document
  belongs_to :account
end

a = Account.new
a.save!

s = Submission.new
s.update_attributes({"account" => {"id" => a.id}})
s.save!

a.id == s.account.id  # false

update_attributes 的调用正在创建一个新的空白Account 对象,而不是引用我告诉它使用的现有对象。怎么回事?

更新

需要明确的是,我正在尝试在 update 操作中处理 HTML 表单,该操作将 Account 添加到 Submission。我知道还有其他方法可以通过编写特定代码来链接这些文档。但是正常的 rails 方式应该允许我使用 HTML 表单以这种方式更新文档,对吧?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 mongoid database-relations


    【解决方案1】:

    更改您的 HTML 表单以使“account_id”而不是“account[id]”然后它开始工作:

    s.update_attributes({"account_id" => a.id})
    s.save!
    
    a.id == s.account.id  # true
    a == s.account # true
    

    它在做什么很奇怪。也许是 mongoid 错误?

    【讨论】:

      【解决方案2】:

      这不是将s 添加到a 的方法。你想做的是这样的:

      a = Account.new
      a.submissions << Submission.new
      a.save!
      

      【讨论】:

      • 谢谢,这确实有效,但这不是我想做的。我更新了问题以指出我正在尝试通过表单将Account 添加到Submission
      • 您仍然应该保存父对象,而不是子对象。 (根据您提供的模型,您不是“将Account 添加到Submission。”Accounts 持有Submissions,而不是相反。)您是否使用 Rails 表单 gem处理关系?也许如果您从 update 方法中发布一些代码,我可以提供帮助。
      • 我听到你在说什么,但是 Submission 文档在 mongo 中有 account_id 字段,而不是相反。我应该能够更新Submission 并将其指向Account,即使我只有对Account 对象的只读访问权限。我的update 方法是纯香草脚手架,HTML 表单正在发布问题中的内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2020-10-07
      • 2012-02-04
      相关资源
      最近更新 更多