Ruby on rails 如果Rails中的字段为空,如何替换group/sum中的字段

Ruby on rails 如果Rails中的字段为空,如何替换group/sum中的字段,ruby-on-rails,postgresql,ruby-on-rails-4,activerecord,Ruby On Rails,Postgresql,Ruby On Rails 4,Activerecord,我有以下的表达: @last_report = @all_reports.where(reporting_date: Report.select('MAX(reporting_date)')) .order(probability: :desc) .group(:probability, :reporting_date)

我有以下的表达:

@last_report = @all_reports.where(reporting_date: Report.select('MAX(reporting_date)'))
                                   .order(probability: :desc)
                                   .group(:probability, :reporting_date)
                                   .select("probability,
                                   SUM(proposals) AS proposals,
                                   SUM(amount) AS amount,
                                   SUM(amount_tp) AS amount_tp")
可能是某些记录中的
amount\u tp
字段为空。在这种情况下,必须将其替换为
金额


我如何才能做到这一点?

肯定有一种更简洁的方法,但在计算之前,请尝试:

@last_report.each { |x| (x.update_attributes(amount_tp: x.amount) if x.amount_tp.nil? }

这将遍历每个报告,如果金额为零,则为其指定一个x.amount的值。然后按照上面的方法执行,无论何时amount_tp属性为nil,它现在都将等于amount属性

Sql的
合并
可能就是您要寻找的函数。下面是PostgreSQL的主要功能

用法如下:
COALESCE(value,…)
,因此函数返回第一个非空值:

@last_report = @all_reports.where(reporting_date: Report.select('MAX(reporting_date)'))
                                   .order(probability: :desc)
                                   .group(:probability, :reporting_date)
                                   .select("probability,
                                   SUM(proposals) AS proposals,
                                   SUM(amount) AS amount,
                                   SUM(COALESCE(amount_tp, amount)) AS amount_tp")

当时,你可以做一个
案例
/
时:
'SUM(当amount\u tp为空时,那么amount ELSE amount\u tp')
你在用什么样的数据库?我用postgresqlOk明白了:“当amount\u tp为空或amount\u tp=0时,那么amount ELSE amount ELSE amount\u tp END)作为amount对我来说很有效,因为我刚刚意识到amount也可以是0(这是替换的另一个例子)。我接受了@IgorDrozdov的解决方案,因为它是我原来问题的解决方案。