我正试图在论坛主题上添加一个"粘性"选项。这就是我的迁移看起来像的样子
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
为什么此属性的默认值是String?
编辑:如果我保存对象,它不会改变粘性属性,即它仍然是"f"。
在psql中,布尔值显示为t
或f
。根据DB驱动程序的不同,它们会被转换为布尔值或留在字符串表示中。
PHP中的PDO驱动程序也做同样的事情。(或者过去,无论如何……我隐约记得它在最新版本中已经不复存在了。)
除非您在RoR或数据库驱动程序中发现错误,否则您可以将读取访问器定义(覆盖)为:
def sticky
! [false, nil, 'f'].include?( self[:sticky] )
end
这将把已知的"false"值转换为真正的ruby布尔值。
我记得至少有两个gem可以连接到PostgreSQL数据库。也许你可以用另一个?
你确定数据库中的列没有定义为字符串吗?我知道在你的迁移中,它是布尔值,但也许哪里出了问题?
我不确定问题出在哪里,但我只是回滚了迁移并再次运行,这次成功了。把这个放在这里,以防其他人遇到类似的问题。
谢谢你们的帮助。