常に整数値を返すメソッドを作成する必要がありました。レコードが存在しない場合、メソッドは0を返します
クエリ対象の列に一意のインデックスがあり、2つの解決策を考え出しました。
# 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にジョブを与えることでデータベースサーバーの負荷を最小限に抑えます。
Ruby1.9.3およびPostgres9.1の実行