【发布时间】:2021-11-14 15:09:29
【问题描述】:
该问题的另一种说法是:“有哪些 Ruby 库或方法可以测试任意数据结构(散列、数组、整数、浮点数、字符串等)的形状?”
首先,让我举一个简单的例子:
hash_1 = {
k1: 1.0,
k2: 42,
k3: {
k4: "100.00",
k5: "dollars"
}
}
接下来,我想验证它——我的意思是与形状/架构/模板进行比较,例如:
shape_a = {
k1: Float,
k2: Integer,
k3: Hash
}
或者,也许是更具体的形状:
shape_b = {
k1: Float,
k2: Integer,
k3: {
k4: String,
k5: String
}
}
一种可能的 API 可能如下所示:
require '_____________'
hash_1.schema = shape_a
hash_1.valid? # => true
hash_1.schema = shape_b
hash_1.valid? # => true
这些只是示例,我对其他方法持开放态度。
大约 3 年前,我写了schema_hash 来挠痒痒。我计划更新它,但首先我想了解替代方案和更好的方法。
这个问题的动机来自一个 Mongo 用例,但这个问题不一定是 Mongo 特有的。
就像我在顶部提到的那样,我希望看到或构建验证任意数据结构的能力:散列、数组、原语等,在任何嵌套组合中。
“你不需要 Mongo 的模式,那么你为什么要关心?”
- 就像我上面提到的,我并不是专门考虑 Mongo 用例
- 但即使在 Mongo 的上下文中,即使您不想要求数据结构采用某种形状,根据形状测试数据结构或模式并采取相应的行动。
“为什么不写自定义验证?”
当我从事以前的项目时,这正是我开始的地方。为嵌套哈希重复编写验证是很痛苦的。我开始思考怎样才能让它变得更容易,我想出了一个类似于我上面分享的语法。
外面有什么?我应该尝试什么?
说了这么多,我很好奇其他人在做什么。有没有“黄金之路”?我正在尝试不同的方法,包括嵌入文档和 validates_associated 与 Mongoid 例如...但是当哈希嵌套超过一个级别或这么深时,这些方法似乎有点过头了。
我四处寻找Validation on Ruby Toolbox 进行验证(双关语),但没有找到我要找的东西。当我在那里时,我建议了一个名为“验证”的新类别。
很可能我所问的内容不太适合“验证”主题领域,而更适合其他领域,例如“数据结构”和“遍历”。如果是这样,请指出正确的方向。
【问题讨论】:
-
我不想围绕我放在一起的特定 API 和代码进行过多的对话——我对替代品更感兴趣——但如果比较有用,请点击此处是
schema_hashgem 的两个核心部分:schemable.rb 和 traversable.rb -
关于黄金之路,五年过去了:现在有许多“嵌套模型”方法值得一试,其中包括 Disposable、ArDocStore、dry-types 和 Rails 5 属性 API。这个想法是您将嵌入文档视为比散列更高级别且更受约束的东西。验证是其中的一部分,但不是唯一的部分。人们还可能受益于将哈希表示为具有访问器方法的对象树、类型强制以及能够重用文档形状等。