【问题标题】:How to move double nested embedded Mongoid documents between single embedded Mongoid documents?如何在单个嵌入式 Mongoid 文档之间移动双嵌套嵌入式 Mongoid 文档?
【发布时间】:2013-01-29 14:27:45
【问题描述】:

扩展 Mongoid 关系文档中的示例,假设我有三个类...

class Band
  include Mongoid::Document
  embeds_many :albums
end

class Album
  include Mongoid::Document
  field :name, type: String
  embedded_in :band
  embeds_many :tracks
end

class Track
  include Mongoid::Document
  field :name, type: String
  field :length, type: String
  embedded_in :album
end

如何将曲目从一张专辑移动到另一张专辑?我已经尝试了明显的...

~/Projects/mongoid_testing (development) > Band.last.albums.first.tracks.first.update_attribute :album_id, Band.last.albums.second.id
☘ MongoDB (8ms) [mongoid_testing_development::Bands] QUERY selector={"$query"=>{}, "$orderby"=>{:_id=>-1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil
☘ MongoDB (0ms) [mongoid_testing_development::Bands] QUERY selector={"$query"=>{}, "$orderby"=>{:_id=>-1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil
☘ MongoDB (0ms) [mongoid_testing_development::Bands] UPDATE selector={"_id"=>"51005ceb93e53c2eec000012"} update={"$set"=>{"albums.0.tracks.0.album_id"=>"51005d2993e53c2eec000017"}} flags=[]
=> true
~/Projects/mongoid_testing (development) > Band.last
☘ MongoDB (0ms) [mongoid_testing_development::Bands] QUERY selector={"$query"=>{}, "$orderby"=>{:_id=>-1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil
=> #<Band:0x007fa22725b1f8> {
           :_id => "51005ceb93e53c2eec000012",
      :albums => [
        [0] {
               "_id" => "51005d2293e53c2eec000016",
            "tracks" => [
                [0] {
                         "_id" => "5107d87993e53c7191000007",
                    "album_id" => "51005d2993e53c2eec000017",
                       "title" => "Pipeline"
                }
            ],
              "name" => "Violater"
        },
        [1] {
             "_id" => "51005d2993e53c2eec000017",
            "name" => "Construction Time Again"
        }
    ]
}

我已经尝试了不那么明显的...

class Track
  ...
  def move_to(new_album_id)
    _parent.albums.delete self
    _root.albums.find(new_album_id).tracks.push self
  end
end

但无论如何我似乎都无法重新关联双嵌套嵌入文档。任何人都可以帮忙吗?谢谢。

【问题讨论】:

  • 关于您的第一次尝试,如果我错了,请纠正我,但我很确定这些对象不使用 id 相关,就像它们在关系数据库中那样,具有外键约束等。 ..因为它们是嵌入式文档。我最近使用了 Mongoid,我很确定我做过类似的事情:new_album.tracks &lt;&lt; track_to_move

标签: ruby-on-rails ruby mongoid mongoid3


【解决方案1】:

解决办法

new_parent = Band.first.albums.second
old_track = Band.first.albums.first.tracks.first

unless new_parent.id == old_track.parent.id
  new_parent.tracks << old_track.dup
  old_track.delete
end

【讨论】:

  • 这几乎是我一直在寻找的。但是,我想知道是否可以在不更改嵌入文档的 id 的情况下实现相同的目标
  • 哦,我想通了。我只是在复制旧曲目后立即执行 old_track.update_attribute(:id, new_track.id)
猜你喜欢
  • 1970-01-01
  • 2011-08-19
  • 1970-01-01
  • 2012-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多