ActiveRecord: write_attribute and UTC conversion

Posted by Moser on 23 Jun 2009

A little gotcha with custom setters for datetime attributes is, that when setting an attribute through ‘write_attribute’ it is not converted to UTC (or whatever else your default time zone is). This problem can easily be reproduced:

./script/generate model Thing a:datetime b:datetime

My model:

class Thing < ActiveRecord::Base
  def b=(d)
    write_attribute(:b, d)
  end
end

My tests:

require 'test_helper'

class ThingTest < ActiveSupport::TestCase
  test "a and b" do
    d = DateTime.now
    t = Thing.new
    t.a = d
    t.b = d
    t.save
    assert_equal t.a, t.b
    t.reload
    assert_equal t.a, t.b
  end
end

The second assertion will fail. Is this intended or a bug? Quick fix:

  def b=(d)
    d = d.utc
    write_attribute(:b, d)
  end