gpt4 book ai didi

ruby-on-rails - 在列中存储版本号(例如 1、1.1、1.11、1.11.1)的最佳方法?

转载 作者:搜寻专家 更新时间:2023-10-30 20:33:20 25 4
gpt4 key购买 nike

我需要在我的 Rails 应用程序中存储 WCAG 的成功标准树:https://www.w3.org/TR/WCAG20/

到目前为止,所有成功标准都取自 WCAG 2.0。现在,WCAG 2.1 添加了更多成功标准,我也需要存储这些标准,并能够将它们与 WCAG 2.0 分开。

所以我想加一个wcag字段到表中,并添加值 2.0现有的成功标准。然后我想添加值为 2.1 的新成功标准.

起初我想使用普通的 float ,但后来我意识到版本号有不同的逻辑:

  • 对于 float ,这适用:1.11 < 1.2
  • 对于版本号,它是相反的:1.11 > 1.2

如何在数据库中存储这种特殊类型的数据?最好同时保留 max 之类的方法和 min ,以及将它们相互比较的简单方法( <>= 等)?

最佳答案

版本“数字”并不是真正的数字,它们是有限的数字序列(即它们是数组)。所以 1.11.6 实际上是 [1, 11, 6] 的表示。

如果您使用的是 PostgreSQL,那么您可以访问数组列,因此您可以使用 int[] 列,在输入时分解字符串:

version_number.split('.').map(&:to_i)

然后将它们放回一起输出:

version_array.join('.')

PostgreSQL 数组逐个元素进行比较,因此排序将在数据库中按需要进行:

psql> select array[1,2,3] > array[1,2];
-- True
psql> select array[1,2,3] > array[1,2,5];
-- False

如果您无权访问数组列,那么您可以左填充版本组件以将它们作为字符串存储在数据库中:

 '1.2.3'.split('.').map { |s| s.rjust(4, '0') }.join('.')
# "0001.0002.0003"

当你把它们拉出来的时候把它们清理干净:

'0001.0002.0003'.split('.').map(&:to_i).join('.')
# "1.2.3"

'0001.0002.0003''0001.0012' 这样的字符串将在数据库中按需要排序,同时仍然可以按原样理解。缺点是您必须决定组件的大小,以便您可以正确填充组件。


您可能希望将所有这些都包装在一个 ActiveRecord 关注点中,以隐藏所有丑陋和字符串争用。

关于ruby-on-rails - 在列中存储版本号(例如 1、1.1、1.11、1.11.1)的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57483310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com