取postgres和sqlite3中布尔列的平均值

时间:2013-03-14 21:11:53

标签: ruby-on-rails postgresql activerecord sqlite rails-activerecord

我有很多使用表达式平均值查找百分比的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?

1 个答案:

答案 0 :(得分:3)

数据库中的布尔值难以移植:

  1. MySQL和SQLite本身使用C风格的布尔值。
  2. SQLite的ActiveRecord驱动程序有时会错误地uses 't' and 'f' strings for booleans。这可能会在较新版本中修复。
  3. PostgreSQL有一个本机布尔类型。
  4. 其他数据库做其他事情。
  5. 有时会自动转换为数值,有时则没有。
  6. Profit.
  7. 如果你想以便携式方式进行此操作,那么你应该手动转换布尔值。在你的情况下,你很幸运有一个表达式产生一个本机布尔值,所以你不必担心AR的SQLite脑损伤。一个简单的案例应该让事情在任何地方都起作用:

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

    这会给你一个浮点结果(可能是Float或BigDecimal)然后你可以决定你想从那里处理它。