【问题标题】:Update embedded document in mongoid更新 mongoid 中的嵌入文档
【发布时间】:2017-02-19 18:52:51
【问题描述】:

我有一个嵌入供应商的简单投标模型:

class Bid
  include Mongoid::Document
  field :amount, type: Integer
  embeds_one :supplier
  accepts_nested_attributes_for :supplier
end

许多投标有相同的供应商。如果我使用的是脚手架编辑视图,我将如何在更新方法中更新投标中嵌入供应商的所有实例?

我尝试过类似的方法,但没有成功

def update
  @supplier.update(supplier_params)
  #or
  #bids = Bid.where('supplier._id' => @supplier.id)
  #bids.supplier.update_attributes!(supplier_params)
  redirect_to @supplier
end

【问题讨论】:

  • How would I update all of the instances of the embedded supplier in bids? 是什么意思 - 这个问题没有意义,因为您有 embeds_one 关系。因此,更新投标永远不会更新多个供应商。

标签: ruby-on-rails mongoid


【解决方案1】:

由于您使用的是nested attributes,您应该能够通过传递supplier_attributes 来更新嵌套记录。

Bid.find(1).update(supplier_attributes: { foo: 'bar' } )

要将嵌套参数列入白名单,请使用哈希选项:

params.require(:bid).permit(supplier_attributes: [:foo])

要生成您使用的表单字段fields_for

<%= form_for(@bid) do |f| %>
  <%= f.fields_for(:supplier) do |s| %>
    <%= s.label :foo do %>
      <%= s.text_field :foo %>
    <% end %>
  <% end %>
<% end %>

【讨论】:

  • 这是 mongoid,不是活动记录?
  • 没错,错误的文档链接,但 mongoid 中的嵌套属性几乎与 AR 中的一样。 mongoid.github.io/old/en/mongoid/docs/nested_attributes.html
  • 我不相信 mongoid 4 和 6 之间的嵌套行为有很大差异,但 v6 文档真的很糟糕。 docs.mongodb.com/ruby-driver/master/tutorials/6.0.0/…
  • 是的,我尝试遵循这些,但我无法获得正确的格式。供应商更新方法中的实际更新行会是什么样子?
  • 取决于 - 如果操作类似于 PATCH bids/:bid_id/supplier 仅用于更新供应商,您只需使用 bid_id 参数找到投标并使用参数更新 @bid.supplier 就像任何其他资源。如果您想要在同一个请求中更新投标和供应商,那么除了将嵌套属性列入白名单之外,您实际上不需要任何特殊操作。
猜你喜欢
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 2016-08-11
  • 2011-04-11
  • 1970-01-01
相关资源
最近更新 更多