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>)


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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/date_time_attribute.rb', line 51

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

  attributes.each do |attribute|
    attribute = attribute.to_sym
    is_active_record_attribute = respond_to?(:attribute_method?) && attribute_method?(attribute)

    # ActiveRecord lazy initialization issue: https://github.com/einzige/date_time_attribute/issues/2
    if is_active_record_attribute && !@attribute_methods_generated
      define_attribute_methods
    end

    attr_accessor attribute unless method_defined?(attribute)

    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

    alias_method "old_#{attribute}=", "#{attribute}="

    define_method("#{attribute}=") do |val|
      in_time_zone(time_zone) do |time_zone|
        container = date_time_container(attribute).in_time_zone(time_zone)
        container.date_time = val
        self.send("old_#{attribute}=", container.date_time)
      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