2

式の平均を使用してパーセンテージを見つけるActiveRecordクエリがたくさんあります。次に例を示します。

def self.undergraduate_degree_percentage
  self.average("undergrad_college_name != ''")
end

これらはsqlite3(開発データベース)用に構築されましたが、pgがブール値を異なる方法で処理するため、postgres(本番データベース)で機能しなくなります。生成されるエラーはのようなものERROR: function avg(boolean) does not exist at character 8です。このタイプのクエリをsqlite3とPGの両方で機能させるためのエレガントな方法はありますか?

4

1 に答える 1

3

データベースのブール値は、移植可能に操作するのが困難です。

  1. MySQL と SQLite はネイティブで C スタイルのブール値を使用します。
  2. SQLite 用の ActiveRecord ドライバーは、 boolean に誤ってand文字列を使用する't''f'ことがあります。これは、新しいバージョンで修正される可能性があります。
  3. PostgreSQL にはネイティブのブール型があります。
  4. 他のデータベースは他のことを行います。
  5. 数値への自動キャストがある場合とない場合があります。
  6. ?
  7. 利益。

これを移植可能にしたい場合は、ブール値を手動で変換する必要があります。あなたの場合、ネイティブのブール値を生成する式を持っていることは幸運であるため、AR の SQLite 脳の損傷について心配する必要はありません。単純な CASE は、どこでも同じように動作するようにする必要があります。

self.average(%q{
  case
    when undergrad_college_name != '' then 1.0
    else 0.0
  end
})

これにより、浮動小数点の結果 (おそらく Float または BigDecimal) が得られ、そこからどのように処理するかを決定できます。

于 2013-03-14T22:00:21.910 に答える