5

フォーラムのトピックに「スティッキー」オプションを追加しようとしています。これは私の移行がどのように見えるかです

  def self.up
    add_column :topics, :sticky, :boolean, :null => false, :default => false
  end

  def self.down
    remove_column :topics, :sticky
  end

これはmysqlでローカルに完全に機能しますが、変更をheroku(PostgreSQLを使用)にプッシュすると、コンソールを使用したときにこれが得られます。

>> t.sticky
=> "f"
>> t.sticky.class
=> String
>> t.sticky = true
=> true
>> t.sticky.class
=> TrueClass

このプロパティのデフォルト値が文字列であるのはなぜですか?

編集:オブジェクトを保存しても、スティッキープロパティは変更されません。つまり、「f」のままです。

4

3 に答える 3

4

psql では、ブール値はtまたはとして表示されfます。DB ドライバーに応じて、これらはブール値に変換されるか、文字列表現のままになります。

PHP の PDO ドライバーも同じことを行います。(または、とにかく、以前は...最新バージョンではもう機能していないことを漠然と思い出しています。)

于 2011-05-24T10:37:18.920 に答える
3

Denis が提案するように、RoR またはデータベース ドライバーにバグが見つからない限り、読み取りアクセサーを次のように定義 (オーバーライド) することができます。

def sticky
  ! [false, nil, 'f'].include?( self[:sticky] )
end

これにより、既知の「false」値が実際の Ruby ブール値に変換されます。

PostgreSQL データベースに接続するための gem が少なくとも 2 つあったことを思い出します。多分あなたは他のものを使うことができますか?

また、データベースの列が文字列として定義されていないことは確かですか? あなたの移行ではブール値であることは知っていますが、どこかで問題が発生した可能性がありますか?

于 2011-05-24T11:50:52.073 に答える
1

何が問題だったのかわかりませんが、移行をロールバックして再度実行したところ、今回はうまくいきました。他の誰かが同様の問題に遭遇した場合に備えて、これをここに置いてください。

助けてくれてありがとう。

于 2011-05-26T09:37:11.880 に答える