Rails - PostgreSQL/Heroku上没有保存的布尔字段

Bor*_*ris 3 postgresql activerecord ruby-on-rails heroku rails-postgresql

有一个奇怪的问题:

布尔字段未保存在Heroku上(本地工作正常)

细节:

  Rails 2.3 on Heroku (bamboo-ree-1.8.7).
Run Code Online (Sandbox Code Playgroud)

移民

  def self.up
   add_column :users, :send_contact_emails, :boolean, :default => false
  end
Run Code Online (Sandbox Code Playgroud)

在Heroku上:

>> u = User.last
=> #<User id: 100, ......
>> u.send_contact_emails = true
=> true
>> u.save
=> true

>> x = User.last
=> #<User id: 100, ...
>> x.send_contact_emails
=> nil  <---------------------------- Why is this ?
Run Code Online (Sandbox Code Playgroud)

当我在本地执行此操作(Postgresql 8.4)时,它按预期工作.

有任何想法吗 ?

编辑:

直接在DB上进行一些测试:

>> ActiveRecord::Base.connection.execute("SELECT send_contact_emails from users where id = 100")[0]
=> {"send_contact_emails"=>nil}

>> ActiveRecord::Base.connection.execute("UPDATE users SET send_contact_emails=FALSE where id=100")
=> #<PGresult:0x7f76d7593580>

>> ActiveRecord::Base.connection.execute("SELECT send_contact_emails from users where id = 100")[0]
=> {"send_contact_emails"=>"f"}
Run Code Online (Sandbox Code Playgroud)

所以问题在于Rails而不是Postgresql ......

one*_*how 10

确保重新启动应用.

http://devcenter.heroku.com/articles/rake

运行添加新列的迁移后,必须使用"heroku restart"在heroku上手动重新启动应用程序,以便Rails获取更改.


Bor*_*ris 2

看起来问题出在 RAILS 方面。

一旦我手动将值更新为 false:

ActiveRecord::Base.connection.execute("UPDATE users SET send_contact_emails=FALSE")
Run Code Online (Sandbox Code Playgroud)

问题消失了。

(好像 Rails 2.3.10 无法处理布尔字段中的“nil”..)