0

常に整数値を返すメソッドを作成する必要がありました。レコードが存在しない場合、メソッドは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の実行

4

1 に答える 1

4

(おそらくより高価な)集計関数は必要ありませんsum()
そのためにSQL-COALESCE()を使用してください。

COALESCEおそらく最も安い方法です。しかし、コストは非常に小さいので、どちらの方法でも問題ありません。

于 2012-05-15T22:38:14.447 に答える