0

我需要编写一个始终返回整数值的方法。如果记录不存在,则该方法返回 0

我在被查询的列上有一个唯一索引,并提出了两种解决方案:

# Option a) Ruby logic
def some_method id
  result = Model.some_scope.find(:first,
                                  conditions: { foo_id: id },
                                  select: :int_value)

  # Return 0 if record does not exist:
  ( result.nil? ? 0 : result.int_value )
end


# Option b) Allow Postgres to do the work
def some_method id
  # sum() returns 0 if the record wasn't found
  Model.some_scope.where(foo_id: id).sum(:int_value)
end

由于唯一索引,两种方法都返回相同的值。

除了简洁之外,还有什么理由比另一种解决方案更好吗?

我倾向于选择基于服务器资源的解决方案,即通过将工作交给 Ruby 来最小化数据库服务器负载。


运行 Ruby 1.9.3 和 Postgres 9.1

4

1 回答 1

4

您不需要(可能更昂贵的)聚合函数sum()
为此使用 SQL- COALESCE()

COALESCE可能是最便宜的方式。但成本如此之小,无论哪种方式都无所谓。

于 2012-05-15T22:38:14.447 回答