【问题标题】:Rails 3 migrations: boolean (mysql vs postgreSQL)Rails 3 迁移:布尔值(mysql vs postgreSQL)
【发布时间】:2011-05-24 10:28:41
【问题描述】:

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

  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”。

【问题讨论】:

  • 我在本地 Postgres 或 Heroku 上看不到这种行为。我正在使用 pg gem 的 Rails 3.0.7 和 0.11.0 版本。顺便说一句,我强烈建议在您的开发机器上本地使用 Postgres。 Postgres 和 mysql 之间存在许多差异(分组依据、区分大小写等),即使这不是(或不应该)其中之一,最终你也会遇到一些问题。

标签: ruby-on-rails ruby-on-rails-3 postgresql heroku rails-migrations


【解决方案1】:

在 psql 中,布尔值显示为 tf。根据 DB 驱动程序,它们会被转换为布尔值或保留在其字符串表示中。

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

【讨论】:

  • 我明白了。知道为什么 rails 不自动将它们转换为布尔值吗?
  • 对于 RoR 开发人员来说,这将是一个很好的问题/错误报告。 :-)
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 我已经很久没有使用 ruby​​ PostgreSQL 驱动程序了,但我似乎记得 TRUE 和 FALSE 分别作为字符串 't' 和 'f' 返回。由于所有其他语言的 PostgreSQL 绑定都正确地将它们映射到它们的本机布尔数据类型,因此非常烦人。我刚刚查看了bitbucket.org/ged/ruby-pg/src/b5361e087db3/ext/pg.c,它看起来好像Ruby 驱动程序的状态没有发生任何变化。需要检查 Pg 的 BOOLOID 的 OID,它需要返回一个 Qtrue 或 Qfalse。
  • 我正在使用 ruby​​-postgres (0.7.9.20080128),我的模型在应该有的地方有布尔值。也许就我而言,这是因为 Rails 1.2.6。老 gem + 老 Rails = 成功? ;-)
  • 可能是。我也完全可以接受错误(并且很高兴被证明是错误的!),但我没有在原生 ruby​​-pg 驱动程序中看到 PostgreSQL 的 bool oid 和 Ruby bool 类型之间的类型映射(我也只使用了2分钟看一眼)。我在猜测,但我假设 Rails 中的其他东西正在进行转换。
【解决方案3】:

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

感谢你们的帮助。

【讨论】:

  • 那么可能是创建的列类型不对?
  • 很有可能,尽管我不确定为什么。我根本没有改变任何东西,只是回滚了一步,然后再次运行迁移。
猜你喜欢
  • 2011-07-30
  • 2012-07-02
  • 2017-07-23
  • 2011-08-26
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
相关资源
最近更新 更多