module Sequel::Plugins::TstzrangeFields
Constants
- VERSION
Public Class Methods
configure(model, *args)
click to toggle source
# File lib/sequel/plugins/tstzrange_fields.rb, line 37 def self.configure(model, *args) unless model.db.schema_type_class(:tstzrange) msg = 'tstzrange_fields plugin requires pg_range db extension to be installed. ' \ ' Use db.extension(:pg_range) after the db = Sequel.connect call.' raise msg end args << :period if args.empty? args = args.flatten setup_model(model) args.flatten.each do |column| create_accessors(model, column) end end
create_accessors(model, column)
click to toggle source
# File lib/sequel/plugins/tstzrange_fields.rb, line 70 def self.create_accessors(model, column) get_column_method = column.to_sym set_column_method = "#{column}=".to_sym get_begin_method = "#{column}_begin".to_sym set_begin_method = "#{column}_begin=".to_sym get_end_method = "#{column}_end".to_sym set_end_method = "#{column}_end=".to_sym model.define_method(get_column_method) do self[column] end model.define_method(set_column_method) do |value| case value when Sequel::Postgres::PGRange self[column] = value when Float::INFINITY range = Sequel::Postgres::PGRange.new(nil, nil, empty: false, db_type: :tstzrange) self[column] = range when 'empty' self[column] = Sequel::Postgres::PGRange.empty(:tstzrange) else beg = value.respond_to?(:begin) ? value.begin : (value[:begin] || value['begin']) en = value.respond_to?(:end) ? value.end : (value[:end] || value['end']) self[column] = self.class.new_tstzrange(beg, en) end end model.define_method(get_begin_method) do send(get_column_method).begin end model.define_method(set_begin_method) do |new_time| new_range = self.class.new_tstzrange(new_time, send(get_end_method)) send(set_column_method, new_range) end model.define_method(get_end_method) do r = send(get_column_method) return r.nil? ? nil : r.end # &.end is invalid syntax end model.define_method(set_end_method) do |new_time| new_range = self.class.new_tstzrange(send(get_begin_method), new_time) send(set_column_method, new_range) end end
setup_model(model)
click to toggle source
# File lib/sequel/plugins/tstzrange_fields.rb, line 53 def self.setup_model(model) model.class.define_method(:new_tstzrange) do |b, e| b = value_to_time(b) e = value_to_time(e) return Sequel::Postgres::PGRange.empty(:tstzrange) if b.nil? && e.nil? return Sequel::Postgres::PGRange.new(b&.to_time, e&.to_time, db_type: :tstzrange, exclude_end: true) end model.class.define_method(:value_to_time) do |v| return v if v.nil? return v if v.respond_to?(:to_time) return Time.parse(v) end end