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中,布尔值显示为t
或f
。 根据数据库驱动程序,这些转换为布尔值或保留在其字符串表示中。
PHP中的PDO驱动程序也做同样的事情。 (或者过去常常……我依旧回忆起它的最新版本不再适用。)
除非您在RoR或数据库驱动程序中发现错误(如Denis所建议),否则您可以将读取访问器定义(覆盖)为:
def sticky ! [false, nil, 'f'].include?( self[:sticky] ) end
这会将已知的“假”值转换为真正的ruby布尔值。
我记得至少有两个gem连接到PostgreSQL数据库。 也许你可以使用另一个?
并且您确定数据库中的列未定义为String吗? 我知道在你的迁移中它是布尔值,但也许某个地方出错了?
我不确定问题是什么,但我只是回滚了迁移并再次运行它,这次它运行起来了。 只是把它放在这里以防其他人遇到类似的问题。
谢谢你的帮助。
- git push heroku master失败“HTTP 400 curl 22请求的URL返回错误”
- Heroku文件上传问题
- 如何在rails 4中管理多个css文件?
- 将redis部署到heroku无法连接
- Heroku 500内部服务器错误未定义方法’用户名’为nil:NilClass
- Sass :: SyntaxError:“position:”之后的CSS无效:期望的表达式(例如1px,粗体)
- 推送到Heroku时Rails迁移错误w / Postgres
- omniauth与facebook没有合作生产
- 从AWS S3读取CSV文件时获取“Errno :: ENOENT:没有此类文件或目录@ rb_sysopen”