使用 mongoid 在 rails 中保存带有嵌入对象/文档的对象

Posted

技术标签:

【中文标题】使用 mongoid 在 rails 中保存带有嵌入对象/文档的对象【英文标题】:Saving Object with embedded objects/documents in rails with mongoid 【发布时间】:2022-01-19 19:45:38 【问题描述】:

所以我有一个新的 Rails 项目,我创建了一些我在下面列出的类。 我的问题是,当尝试在我的控制器中创建“Skabelon”时,它失败并显示“ArgumentError(参数数量错误(给定 2,预期 0..1))

我的控制器下面还有一个小例子,说明 json 数据是如何来自前端的。 附言。我必须使用 embedded_in 而不是 has_many 来做到这一点,因为我不希望所有这些都有自己的集合

Skabelon.rb


class Skabelon
  include Mongoid::Document
  store_in collection: 'skabeloner'

  field :title, type: String
  embeds_many :sektioner, class_name: "Sektion"

end


sektion.rb


class Sektion
  include Mongoid::Document
  field :title

  embeds_many :felter, class_name: "SektionFelt"
  embedded_in :skabelon

end

sektion_felt.rb


class SektionFelt
  include Mongoid::Document
  field :type
  field :text
  field :felter
  embedded_in :sektion

end


然后我有以下控制器: 被调用的方法是从前端发送的 post 请求中“创建”

class SkabelonController < ApplicationController

  # GET /skabeloner
  def index
    render json: Skabelon.all
  end

  # GET /skabeloner/1
  def show
    render json: Skabelon.find(params[:id])
  end

  # POST /skabeloner
  def create
    skabelon = Skabelon.new(skabelon_params)
    skabelon.save

  end

  # PATCH/PUT /skabeloner/1
  def update
   
  end

  # DELETE /skabeloner/1
  def destroy
  end

  private
    # Only allow a list of trusted parameters through.

  def skabelon_params
    params.permit!
  end

end

从客户端到服务器的 JSON:

 skabelon: 
        title: 'Oplysninger om barnet',
        sektioner: [
          felter: [type: 'text', text: 'Name']
]

【问题讨论】:

【参考方案1】:

我认为你有几个问题。首先,您似乎正在尝试分配 JSON 的错误部分。 IE。您正在传递具有*** skabelon 属性的 JSON。这就是您可能想要分配给新 Skabelon 实例的内容。

skabelon = Skabelon.new(skabelon_params[:skabelon])

其次,您的 sektionerfelter 属性在 JSON 中命名错误。由于它们被标记为embeds_many,因此它们需要是复数形式:sektionersfelters

【讨论】:

您好,感谢您的帮助。看来您对我没有查看正确级别的 JSON 是正确的。现在我没有收到任何错误,但它只保存了***“Skabelon”并且所有嵌入的对象都没有保存在数据库中任何想法? 我已经摆弄了一段时间,现在我卡住了:NoMethodError (undefined method `_association' for #<:parameters> 您可以尝试直接指定强参数。例如params.permit(skabelon: [:title, sketioners: [felters: [:type, :text]]])

以上是关于使用 mongoid 在 rails 中保存带有嵌入对象/文档的对象的主要内容,如果未能解决你的问题,请参考以下文章

修改 rails mongoid 查询中的值

管理 mongoid 迁移

如何在 Mongoid & Rails 中使用数组字段?

如何将内存中的 MongoDB 与 Rails、Mongoid 和 Rspec 一起使用?

如何在现有的rails模型中使用mongoid来种植数据?

Rails,mongoid,heroku 性能