Ruby on rails 如何在RubyonRails中为Postgres保存无限的日期范围?
我正在使用: 轨道5.2.3 Ruby 2.6.3 PostgreSQL 11.2 我有一个具有字段有效日期范围的模型Foo,下面是要创建的迁移:Ruby on rails 如何在RubyonRails中为Postgres保存无限的日期范围?,ruby-on-rails,ruby,postgresql,Ruby On Rails,Ruby,Postgresql,我正在使用: 轨道5.2.3 Ruby 2.6.3 PostgreSQL 11.2 我有一个具有字段有效日期范围的模型Foo,下面是要创建的迁移: class CreateFoos < ActiveRecord::Migration[5.2] def change create_table :foos do |t| t.daterange :effective_date_range t.timestamps end end end Ruby
class CreateFoos < ActiveRecord::Migration[5.2]
def change
create_table :foos do |t|
t.daterange :effective_date_range
t.timestamps
end
end
end
Ruby 2.6.3和Postgres 11.2都支持无限范围。我怎样才能让ActiveRecord与博士后友好交谈呢?但为什么你需要无限?你能做点什么吗
[*Date.today..(300.years.from_now).to_date]
或者只是
range = [Date.today, Date.new(2300,1,1)]
如果你的计划在2300年仍然有效,打电话给我。在那之前,我将等待。:) 你可以试试
Foo.create(effective_date_range: (Date.today...Date::Infinity.new))
PostgreSQl中的值如下所示:
[2019-11-27,)
我更喜欢公认的答案,但如果有人使用不同版本的Ruby/Rails/Postgres,这也很有用:
Foo.create(effective_date_range: "[#{Date.today.to_s(:db)},)")
这可能会有帮助,我担心date和far future是唯一的选择如果你确定它会被存储,我不这么认为。是的,它会被存储。通过ruby 2.5.5、rails 5.1.7、postgres 9.6测试,所以我刚刚发现,虽然它有效:
date.today…date::Infinity.new
,但这给了我一个错误:(-date::Infinity.new)…日期。今天
-***ArgumentError Exception:范围的值不正确
。查找无穷可能会使系统管理员或DBA因为占用系统的响应时间而对他进行攻击。存储和搜索=
开始日期似乎更安全。我需要确定Foo的行为以及与Foo c交互的任何对象的行为除了它的实际值之外,还有一个关于极限存在的条件。我希望代码的目的可以通过查看它来轻松理解。我可以为300年后的极限创建一个值,但这需要任何与Foo交互的对象知道我选择的表示不存在的极限的特定值。但是Ruby和Postgres都支持无限的日期范围。我相信Ruby和Postgres能够实现这种数据结构,而无需无限计算。
Foo.create(effective_date_range: "[#{Date.today.to_s(:db)},)")