【问题标题】:Using interval in PostgreSQL with Ruby on Rails在 PostgreSQL 中使用间隔和 Ruby on Rails
【发布时间】:2017-11-17 23:44:37
【问题描述】:

我想在我的 Rails 应用程序中将持续时间(2 天、5 年……)保存为 PostgreSQL 中的间隔。

duration_min 和 duration_max 都是“2 天”或“5 年”之类的值,因此它们各自都是一个间隔:

  def change
    create_table :times do |t|
      t.interval  :duration_min
      t.interval  :duration_max
      t.timestamps
    end
  end

但是将数据类型设置为“interval”时DB迁移失败,rake返回:

undefined method 'interval' for #<ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::TableDefinition:0x007f8615694360> 

如何定义表格以使其接受(并理解)“2 天”之类的输入?

【问题讨论】:

  • 原始迁移现在适用于 rails 5.1.3(可能 >= 5.1):但是,在回读时,它仍然被视为字符串,例如对于“P1M”或 1.month,记录将包含字符串“730:29:06”。
  • 仅供参考,有一个 Rails PR 支持反序列化:github.com/rails/rails/pull/16919

标签: ruby-on-rails ruby postgresql


【解决方案1】:

你很亲密:

class CreateExamples < ActiveRecord::Migration
  def change
    create_table :examples do |t|
      t.column :duration_min, :interval
      t.column :duration_max, :interval
      t.timestamps
    end
  end
end

使用示例:

Example.create duration_min: '2 hours', duration_max: '2 days'
#=> #<Example id: 1, duration_min: "2 hours", duration_max: "2 days", created_at: "2013-12-02 14:20:36", updated_at: "2013-12-02 14:20:36">
Example.where(%[TIMESTAMP ? - TIMESTAMP ? BETWEEN "duration_min" AND "duration_max"], DateTime.now, 10.hours.ago)
#=> #<ActiveRecord::Relation [#<Example id: 1, duration_min: "02:00:00", duration_max: "2 days", created_at: "2013-12-02 14:20:36", updated_at: "2013-12-02 14:20:36">]>

【讨论】:

    【解决方案2】:

    我们有一个 Rails 5.1 的间隔实现,你可以试试。

    https://gist.github.com/vollnhals/a7d2ce1c077ae2289056afdf7bba094a

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2011-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多