aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb14
-rw-r--r--activerecord/test/cases/adapters/postgresql/array_test.rb16
2 files changed, 29 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb b/activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb
index 18778698e8..7db7d306a4 100644
--- a/activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb
+++ b/activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb
@@ -32,7 +32,7 @@ module ActiveRecord
if create_time_zone_conversion_attribute?(attr_name, columns_hash[attr_name])
method_body, line = <<-EOV, __LINE__ + 1
def #{attr_name}=(time)
- time_with_zone = time.respond_to?(:in_time_zone) ? time.in_time_zone : nil
+ time_with_zone = convert_value_to_time_zone(time)
previous_time = attribute_changed?("#{attr_name}") ? changed_attributes["#{attr_name}"] : read_attribute(:#{attr_name})
write_attribute(:#{attr_name}, time)
#{attr_name}_will_change! if previous_time != time_with_zone
@@ -52,6 +52,18 @@ module ActiveRecord
(:datetime == column.type)
end
end
+
+ private
+
+ def convert_value_to_time_zone(value)
+ if value.is_a?(Array)
+ value.map { |v| convert_value_to_time_zone(v) }
+ elsif value.respond_to?(:in_time_zone)
+ value.in_time_zone
+ else
+ nil
+ end
+ end
end
end
end
diff --git a/activerecord/test/cases/adapters/postgresql/array_test.rb b/activerecord/test/cases/adapters/postgresql/array_test.rb
index e03d83df59..90b72563fa 100644
--- a/activerecord/test/cases/adapters/postgresql/array_test.rb
+++ b/activerecord/test/cases/adapters/postgresql/array_test.rb
@@ -12,6 +12,7 @@ class PostgresqlArrayTest < ActiveRecord::TestCase
@connection.create_table('pg_arrays') do |t|
t.string 'tags', array: true
t.integer 'ratings', array: true
+ t.datetime :datetimes, array: true
end
end
@column = PgArray.columns_hash['tags']
@@ -195,6 +196,21 @@ class PostgresqlArrayTest < ActiveRecord::TestCase
assert_equal tags, ar.tags
end
+ def test_datetime_with_timezone_awareness
+ with_timezone_config aware_attributes: true do
+ PgArray.reset_column_information
+ current_time = [Time.current]
+
+ record = PgArray.new(datetimes: current_time)
+ assert_equal current_time, record.datetimes
+
+ record.save!
+ record.reload
+
+ assert_equal current_time, record.datetimes
+ end
+ end
+
private
def assert_cycle field, array
# test creation