0

我无法使用 mongoid 保存正确的嵌套嵌入文档。我在 v3.1.6 和 v4.0.0 都试过了,结果是一样的。父文档已保存,但我修改的嵌套文档忽略了更改,而是更新了第一个嵌套文档。

假设一些模型是这样的:

Mongoid.configure do |config|
  config.sessions = {default: {hosts: ["localhost:27017"], database: "test_mongoid"}}
end

class Band
  include Mongoid::Document

  field :name, type: String
  embeds_many :members
end

class Member
  include Mongoid::Document
  embedded_in :band

  field :name, type: String
  embeds_many :instruments
end

class Instrument
  include Mongoid::Document
  embedded_in :member

  field :name, type: String

  def make_badass!
    self.name = "Badass #{self.name}"
    self.save
  end
end

和一个运行的程序:

Band.destroy_all

a_band = {
  name: "The Beatles",
  members: [
    {
      name: 'Paul',
      instruments: [
        {
          name: 'Bass guitar'
        },
        {
          name: 'Voice'
        }
      ]
    }
  ]
}
Band.create(a_band)


the_beatles = Band.first

puts the_beatles.as_document

paul = the_beatles.members.first
voice = paul.instruments.where({name: "Voice"}).first

voice.make_badass!

puts Band.first.as_json

数据库现在应该包含:

{
    "_id": ObjectId('53aa7d966d6172889c000000'),
    "name" : "The Beatles",
    "members" : [
        {
            "_id" : ObjectId('53aa7d966d6172889c010000'),
            "name" : "Paul",
            "instruments" : [
                {"_id" : ObjectId('53aa7d966d6172889c020000'), "name" : "Bass guitar"},
                {"_id" : ObjectId('53aa7d966d6172889c030000'), "name" : "Voice"}
            ]
        }
    ]
}

但相反,它包含:

{
    "_id": ObjectId('53aa7d966d6172889c000000'),
    "name" : "The Beatles",
    "members" : [
        {
            "_id" : ObjectId('53aa7d966d6172889c010000'),
            "name" : "Paul",
            "instruments" : [
                {"_id" : ObjectId('53aa7d966d6172889c020000'), "name" : "Badass Voice"},
                {"_id" : ObjectId('53aa7d966d6172889c030000'), "name" : "Voice"}
            ]
        }
    ]
}

从 的实例方法中更改正确的嵌入文档的工作Instrument方式是什么?

谢谢你的帮助!

4

1 回答 1

0

Mongoid 很快就迫使我成为一个酒鬼。希望它会帮助处于相同情况的人。

class Instrument
  include Mongoid::Document
  embedded_in :member

  field :name, type: String

  def make_badass
    self.name = "Badass #{self.name}"
    self.member.band.save
  end

  def unset_name
    # self.unset :name does not work
    self.remove_attribute :name
    self.member.band.save
  end

end
于 2014-06-25T08:10:26.597 回答