我有很多使用表达式平均值查找百分比的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?
答案 0 :(得分:3)
数据库中的布尔值难以移植:
't'
and 'f'
strings for booleans。这可能会在较新版本中修复。如果你想以便携式方式进行此操作,那么你应该手动转换布尔值。在你的情况下,你很幸运有一个表达式产生一个本机布尔值,所以你不必担心AR的SQLite脑损伤。一个简单的案例应该让事情在任何地方都起作用:
self.average(%q{
case
when undergrad_college_name != '' then 1.0
else 0.0
end
})
这会给你一个浮点结果(可能是Float或BigDecimal)然后你可以决定你想从那里处理它。