5

奇妙な問題が発生しました:

ブールフィールドがHerokuに保存されない(ローカルで正常に動作します)

詳細:

  Rails 2.3 on Heroku (bamboo-ree-1.8.7).

移行

  def self.up
   add_column :users, :send_contact_emails, :boolean, :default => false
  end

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 ?

これをローカルで実行すると(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"}

したがって、問題はRailsにあり、Postgresqlにはありません...

4

3 に答える 3

12

必ずアプリを再起動してください。

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

新しい列を追加する移行を実行したら、Railsが変更を取得できるように、「herokurestart」を使用してherokuでアプリを手動で再起動する必要があります。

于 2012-01-11T06:51:48.297 に答える
-1

Rails の Boolean は tinyint 列型を使用するため、DB レベル側では 1/0 です。

API

Class
ActiveRecord::ConnectionAdapters::MysqlAdapter < AbstractAdapter

emulate_booleans

By default, the MysqlAdapter will consider all columns of type tinyint(1) as boolean. If you wish to disable this emulation (which was the default behavior in versions 0.13.1 and earlier) you can add the following line to your environment.rb file:

  ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans = false
于 2011-10-17T12:05:34.013 に答える