RailsでPostgresを使用しています。ブール値を返す副選択を含むクエリがありますが、Postgresは常に't'
またはのような文字列を返します'f'
。しかし、生成されたJSONには、実際のブール値が必要です。
これは私の質問です:
SELECT
*,
EXISTS (
SELECT TRUE
FROM measurement
JOIN experiment ON measurement.experiment_id = experiment.id
JOIN location ON experiment.location_id = location.id
WHERE location.map_id = map.id
LIMIT 1
) AS measurements_exist
FROM "map"
THEN true
使用するかどうTHEN 1
かは関係ありませんTHEN 'true'
。常に文字列を取得します。したがって、私のJSON応答は常に次のようになります。
[
{"id":8, ..., "measurements_exist":"f"},
{"id":9, ..., "measurements_exist":"t"}
]
しかし、それは次のようになります(!):
[
{"id":8, ..., "measurements_exist":false},
{"id":9, ..., "measurements_exist":true}
]
これを正しく機能させる方法はありますか?
ありがとうございました!
ソリューション:
対応するモデル(ここでは:)に、値の変換にMap
使用する属性アクセサーを指定するだけです。value_as_boolean
そのため、コントローラーが値にアクセスしようとするたびに、属性アクセサーメソッドが自動的に使用されます。
コントローラコード:
class MapsController < ApplicationController
def index
select = ["*"]
select.push(measurements_exist) # This will just insert the string returned by the 'measurements_exist' method
maps = Map.select(select) # Results in 'SELECT *, EXISTS (...) AS measurements_exist FROM "map"'
render json: maps
end
private
def measurements_exist
"EXISTS (
SELECT TRUE
FROM measurement
JOIN experiment ON measurement.experiment_id = experiment.id
JOIN location ON experiment.location_id = location.id
WHERE location.map_id = map.id
LIMIT 1
) AS measurements_exist"
end
end
モデルコード:
class Map < ActiveRecord::Base
def measurements_exist
ActiveRecord::ConnectionAdapters::Column.value_to_boolean(self[:measurements_exist])
end
end
結果のJSON:
[
{"id":7, ..., "measurements_exist":false},
{"id":6, ..., "measurements_exist":true}
]