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 中,布尔值显示为tor f。根据 DB 驱动程序,这些会被转换为布尔值或保留在其字符串表示中。

PHP 中的 PDO 驱动程序做同样的事情。(或者曾经,无论如何......我隐约记得它在最新版本中不再这样做了。)

于 2011-05-24T10:37:18.920 回答
3

除非您在 RoR 或数据库驱动程序中发现错误,如 Denis 所建议的,您可以将读取访问器定义(覆盖)为:

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

这会将已知的“假”值转换为真正的红宝石布尔值。

我记得至少有两个 gem 可以连接到 PostgreSQL 数据库。也许你可以使用另一个?

您确定数据库中的列未定义为字符串吗?我知道在您的迁移中它是布尔值,但也许某个地方出了问题?

于 2011-05-24T11:50:52.073 回答
1

我不确定问题出在哪里,但我只是回滚了迁移并再次运行它,这次它成功了。只是把它放在这里以防其他人遇到类似的问题。

谢谢你们的帮助。

于 2011-05-26T09:37:11.880 回答