2

我已经得到了很多的是找到使用表达式的平均百分比的ActiveRecord的查询,例如:以一个布尔列的平均值两者的Postgres和sqlite3的

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

不解决您的问题只是一个建议:尝试在生产中使用的开发中使用相同的数据库。如果你在Mac上,Postgres可以很容易地与[Postgres.app](http://postgresapp.com/)一起使用,或者与Homebrew一起安装。这是避免我曾经做过的最好的头痛之一。 – 2013-03-14 21:24:22

回答

3

布尔值难以便携的工作:

  1. MySQL和SQLite的使用C风格的布尔本身。
  2. SQLite的ActiveRecord驱动程序有时会错误地uses 't' and 'f' strings for booleans。这可能会在更新的版本中修复。
  3. PostgreSQL具有本机布尔类型。
  4. 其他数据库做其他事情。
  5. 有时会自动转换为数字值,有时候没有。
  6. Profit.

如果你想可移植性做到这一点,那么你就应该用手工转换的布尔值。在你的情况下,你很幸运有一个表达式产生一个本地布尔值,所以你不必担心AR的SQLite脑损伤。一个简单的例子应该使事情的工作到处都一样:

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

这会给你一个浮点结果(可能是一个浮动或BigDecimal的),然后你可以决定要如何从那里处理它。

+0

谢谢,这就像一个魅力。 – 2013-03-14 23:39:45