I want to save durations (2 days, 5 years, ...) as intervals in PostgreSQL from my Rails application.
Both duration_min and duration_max are values like "2 days" or "5 years", so each of them is an interval by itself:
def change
create_table :times do |t|
t.interval :duration_min
t.interval :duration_max
t.timestamps
end
end
but the DB migration fails when setting the data type to "interval" and rake returns:
undefined method 'interval' for #<ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::TableDefinition:0x007f8615694360>
How do I define the table for it to accept (and understand) an input like "2 days"?
You were close:
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
Usage example:
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">]>
We have an implementation of interval for Rails 5.1 that you can try.
https://gist.github.com/vollnhals/a7d2ce1c077ae2289056afdf7bba094a
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With