2

我有很多 ActiveRecord 查询使用表达式的平均值找到百分比,例如:

def self.undergraduate_degree_percentage
  self.average("undergrad_college_name != ''")
end

这些是为 sqlite3(开发数据库)构建的,但在 postgres(生产数据库)中分解,因为 pg 处理布尔值的方式不同。生成的错误类似于ERROR: function avg(boolean) does not exist at character 8. 有没有一种优雅的方法可以使这种类型的查询同时适用于 sqlite3 和 PG?

4

1 回答 1

3

数据库中的布尔值很难以便携方式使用:

  1. MySQL 和 SQLite 原生使用 C 风格的布尔值。
  2. SQLite 的 ActiveRecord 驱动程序有时会错误地't''f'字符串用作布尔值。这可能会在较新的版本中得到修复。
  3. PostgreSQL 有一个原生的布尔类型。
  4. 其他数据库做其他事情。
  5. 有时会自动转换为数值,有时则不会。
  6. ?
  7. 利润。

如果您想以便携方式执行此操作,则应手动转换布尔值。在您的情况下,您很幸运拥有一个产生本机布尔值的表达式,因此您不必担心 AR 的 SQLite 脑损伤。一个简单的 CASE 应该让事情在任何地方都一样:

self.average(%q{
  case
    when undergrad_college_name != '' then 1.0
    else 0.0
  end
})

这将为您提供浮点结果(可能是 Float 或 BigDecimal),然后您可以从那里决定如何处理它。

于 2013-03-14T22:00:21.910 回答