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.
time_zone = opts[:time_zone]
attributes.each do |attribute|
attribute = attribute.to_sym
is_active_record_attribute = respond_to?(:attribute_method?) && attribute_method?(attribute)
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
|