Module: DateTimeAttribute::ClassMethods

Defined in:
lib/date_time_attribute.rb

Instance Method Summary collapse

Instance Method Details

#date_time_attribute(*attributes) ⇒ Object

Parameters:

  • attribute (Symbol)

    Attribute name

  • opts (Hash<Symbol>)


50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/date_time_attribute.rb', line 50

def date_time_attribute(*attributes)
  opts = attributes.extract_options!
  time_zone = opts[:time_zone]

  attributes.each do |attribute|
    attribute = attribute.to_sym

    # ActiveRecord issue: https://rails.lighthouseapp.com/projects/8994/tickets/4317-inconsistent-method_defined-bevahiour
    if !(method_defined?(attribute) || (respond_to?(:attribute_method?) && attribute_method?(attribute)))
      attr_accessor attribute
    end

    define_method("#{attribute}_date") do
      in_time_zone(time_zone) do |time_zone|
        date_time_container(attribute).in_time_zone(time_zone).date
      end
    end

    define_method("#{attribute}_time") do
      in_time_zone(time_zone) do |time_zone|
        date_time_container(attribute).in_time_zone(time_zone).time
      end
    end

    define_method("#{attribute}_time_zone") do
      in_time_zone(time_zone) do |time_zone|
        date_time_container(attribute).in_time_zone(time_zone).time_zone
      end
    end

    define_method("#{attribute}_date=") do |val|
      in_time_zone(time_zone) do |time_zone|
        container = date_time_container(attribute).in_time_zone(time_zone)
        (container.date = val).tap do
          self.send("#{attribute}=", container.date_time)
        end
      end
    end

    define_method("#{attribute}_time=") do |val|
      in_time_zone(time_zone) do |time_zone|
        container = date_time_container(attribute).in_time_zone(time_zone)
        (container.time = val).tap do
          self.send("#{attribute}=", container.date_time)
        end
      end
    end

    define_method("#{attribute}_time_zone=") do |val|
      in_time_zone(val) do |time_zone|
        container = date_time_container(attribute).in_time_zone(time_zone)
        self.send("#{attribute}=", container.date_time)
        container.time_zone
      end if val
    end
  end
end