diff options
-rw-r--r-- | activerecord/lib/active_record/attribute_methods/time_zone_conversion.rb | 14 | ||||
-rw-r--r-- | activerecord/test/cases/adapters/postgresql/array_test.rb | 16 |
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 |