列名を取り、モデルのスコープを定義するメソッドがあります。このスコープは、PostgreSQL ウィンドウ関数 (rank() や row_number() など) を使用して、結果のデータセットに列を追加します。たとえば、としてエイリアス化されUser.ranked_on_score
た列を追加する必要があります。rank()
score_ranking
現在、単純な文字列補間(疑似コード)でそれを達成しました:
window_alias = "#{attr}_rankings"
result_alias = "#{attr}_ranking"
select("users.*, #{window_alias}.#{result_alias}")
.join("JOIN (SELECT id, rank() OVER (ORDER BY #{attr} ASC) as #{result_alias} ...")
スコープは事前にマクロとして定義する必要があり、ユーザーからの入力を受け付けないことを考慮すると、このアプローチは安全です。それにもかかわらず、私はそれが好きではありません。
メソッドについては知ってsanitize_sql
いますが、私の場合はうまくいきません。パラメータを一重引用符で囲むのは問題ありませんWHERE
が、句で使用すると構文エラーが発生しますSELECT
(PG では識別子を二重引用符で囲む必要があります)。
識別子をサニタイズする組み込みの方法はありますか? それともそのままにしておくべきですか?