ruby-on-rails 在Ruby on Rails中处理具有不同精度和较宽时间跨度的日期

pkbketx9  于 2023-02-01  发布在  Ruby
关注(0)|答案(1)|浏览(115)

我想知道如何在Ruby on Rails中处理和存储生日之类的日期,因为确切的日期或月份可能是未知的,而且有些生日是公元前。
MySQL似乎支持“1990-00-00”这样的日期,它可以用来存储没有月和日的年份,但BC日期似乎不可能。由于MySQL支持直到9999年的日期,而我只需要直到今天的生日,因此可以使用更高的日期来表示BC日期(9999 = -1,9998 = -2,...),但这看起来很复杂,很乱。

dy2hfwbg

dy2hfwbg1#

切换到Postgresql?哈哈,开个玩笑。有一些解决方案建议在后台给所有日期加上一个常量,然后在显示之前减去它。看起来很混乱。不过Rails并不关心你的日期是多久以前的。所以你可以将这些日期存储为字符串,比如'2023-01-29'或'-5000-01-29',然后在Rails中解析它们:

Date.parse('29 Jan 2023')
=> Sun, 29 Jan 2023

Date.parse('-5000-01-29')
=> Fri, 29 Jan -5000

Date.parse('29 Sep 1000 BC')
=> Sun, 29 Sep -0999

正如你所看到的,Rails处理日期非常好,可以将许多不同的字符串格式解析为日期,你可以覆盖模型中列的setter/getter:

class Foo < ActiveRecord::Base
  # "Uses a string to hold the date for the column 'bar'"

  def bar=(date)
    super(date.to_s)
  end

  def bar
    Date.parse(super)
  end
end

现在,当您有一个Foo的示例并调用.bar时,它将从DB中的字符串转换为日期,当在setter方法中给定日期时,它将为您将其转换为字符串。

相关问题