Rails 3迁移:boolean(mysql vs postgreSQL)

我正在尝试在论坛主题上添加“粘性”选项。 这就是我的迁移的样子

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

PHP中的PDO驱动程序也做同样的事情。 (或者过去常常……我依旧回忆起它的最新版本不再适用。)

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

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

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

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

并且您确定数据库中的列未定义为String吗? 我知道在你的迁移中它是布尔值,但也许某个地方出错了?

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

谢谢你的帮助。