首页 > 解决方案 > 如何将 embeds_many / embedded_in 存储在 mongoid 中作为哈希而不是数组?

问题描述

当我为现有的遗留系统构建新的 API 时,我试图弄清楚如何以对 ODM 有意义的方式对关系进行建模,但要保持与现有的存储结构相同的存储结构。

当前结构存储为:

{
  _id: ObjectId(),
  name: String,
  relationship_ids: {
    "5c06a0eb350e6ef20d1486b9" : {
        "id" : "5c06a0eb350e6ef20d1486b9", 
        "type" : "package"
    },
    "5ba105bf350e6e3f6ef97532" : {
        "id" : "5ba105bf350e6e3f6ef97532", 
        "type" : "something"
    }
 }
}

而且我想对对象进行建模,就好像它是 Rails 中自己的模型一样。我想也许有办法做到这一点,但我在任何地方都看不到。

我猜我需要某种序列化/反序列化适配器或专门在embedded_in do/embeds_many do区域覆盖它......但不确定。

更新:

我猜它以某种方式与这种覆盖方法有关: https ://docs.mongodb.com/mongoid/7.0/api/Mongoid/Association/Embedded/EmbedsMany/Proxy.html

但是我对此有些陌生,并且不知道放置这种覆盖的最佳位置在哪里。

还有其他人对此有解决方案吗?

标签: ruby-on-railsrubymongodbassociationsmongoid

解决方案


您可能可以使用多态关联(请参阅文档“Polymorphism”):

class Band
  include Mongoid::Document
  embeds_many :photos, as: :photographic
end

class Photo
  include Mongoid::Document
  embedded_in :photographic, polymorphic: true
end

class Image
  include Mongoid::Document
  embedded_in :photographic, polymorphic: true
end

多态关系存储相关文档的 id 和类名。


推荐阅读