Ruby Mongoid:具有验证和回调的动态键控静态定义的嵌入式类

Ruby Mongoid:具有验证和回调的动态键控静态定义的嵌入式类,ruby,mongodb,mongoid,Ruby,Mongodb,Mongoid,我对Mongoid和Ruby相当熟悉,并在生产系统中的几个大型应用程序中使用过Mongoid。然而,我发现自己在这个问题上有点不知所措 标题可能有点让人挠头,所以让我举一个JSON示例: { "could_be_anything": { "key": "something", "value": "something else" }, "some_other_runtime_value": { "key": "another", "value": "an

我对Mongoid和Ruby相当熟悉,并在生产系统中的几个大型应用程序中使用过Mongoid。然而,我发现自己在这个问题上有点不知所措

标题可能有点让人挠头,所以让我举一个JSON示例:

{
  "could_be_anything": {
    "key": "something",
    "value": "something else"
  },
  "some_other_runtime_value": {
    "key": "another",
    "value": "another something"
  },
  // ... ect
}
因此,对象的键可以是任何东西,但是其中的数据是结构化的,需要验证,如键和值的存在

我能想到的唯一方法是获取一块表示嵌入对象的类定义的代码,并动态创建一个新类,然后使用该代码块对其进行类评估。我想我可以使用after\u initialize和after\u find来查看所有属性,并以这种方式将它们连接在一起


没有更简单的方法吗?

您真的只是使用半自由形式的散列字段吗?如果是这样的话,你会不会像其他任何字段一样验证散列?是的,你可以这样做,但这将涉及从顶层执行验证,如果它嵌套得很深,可能会变得非常乏味。当你这样做的时候,你失去了self的上下文,你再也不能像验证存在性或整数长度那样对类进行简单的添加,正则表达式都丢失了。此外,回调消失,Mongoid的脏跟踪是一个老鼠窝,因为当叶节点更改时,整个结构标记为已更改。