Rails 3迁移:布尔型(mysql与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。根据DB驱动程序的不同,它们会被转换为布尔值或留在字符串表示中。

PHP中的PDO驱动程序也做同样的事情。(或者过去,无论如何……我隐约记得它在最新版本中已经不复存在了。)

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

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

这将把已知的"false"值转换为真正的ruby布尔值。

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

你确定数据库中的列没有定义为字符串吗?我知道在你的迁移中,它是布尔值,但也许哪里出了问题?

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

谢谢你们的帮助。

相关内容

  • 没有找到相关文章

最新更新