module SuperAccessors::Datetime

Public Instance Methods

split_date_hour_min(*attrs) click to toggle source
Calls superclass method
# File lib/super_accessors/datetime.rb, line 37
def split_date_hour_min(*attrs)
  opts = { format: "%F", default: lambda { Time.now.change(min: 0) } }
  if attrs.last.class == Hash
    custom = attrs.delete_at(-1)
    opts = opts.merge(custom)
  end

  attrs.each do |attr|
    define_method(attr) do
      super() || opts[:default].call
    end

    define_method("#{attr}_date=") do |date|
      return unless date.present?
      date = Date.parse(date.to_s)
      self.send("#{attr}=", self.send(attr).change(year: date.year, month: date.month, day: date.day))
    end

    define_method("#{attr}_hr=") do |hour|
      return unless hour.present?
      self.send("#{attr}=", self.send(attr).change(hour: hour, min: self.send(attr).min))
    end

    define_method("#{attr}_min=") do |min|
      return unless min.present?
      self.send("#{attr}=", self.send(attr).change(min: min))
    end

    define_method("#{attr}_date") do
      self.send(attr).strftime(opts[:format])
    end

    define_method("#{attr}_hr") do
      self.send(attr).hour
    end

    define_method("#{attr}_min") do
      self.send(attr).min
    end
  end
end
split_date_time(*attrs) click to toggle source
Calls superclass method
# File lib/super_accessors/datetime.rb, line 3
def split_date_time(*attrs)
  opts = { format: "%F", default: lambda { Time.now.change(min: 0) } }
  if attrs.last.class == Hash
    custom = attrs.delete_at(-1)
    opts = opts.merge(custom)
  end

  attrs.each do |attr|
    define_method(attr) do
      super() || opts[:default].call
    end

    define_method("#{attr}_date=") do |date|
      return unless date.present?
      date = Date.parse(date.to_s)
      self.send("#{attr}=", self.send(attr).change(year: date.year, month: date.month, day: date.day))
    end

    define_method("#{attr}_time=") do |time|
      return unless time.present?
      time = Time.parse(time.to_s)
      self.send("#{attr}=", self.send(attr).change(hour: time.hour, min: time.min))
    end

    define_method("#{attr}_date") do
      self.send(attr).strftime(opts[:format])
    end

    define_method("#{attr}_time") do
      [self.send(attr).hour.to_s.rjust(2, '0'), self.send(attr).min.to_s.rjust(2, '0')].join(':')
    end
  end
end