0

列名を取り、モデルのスコープを定義するメソッドがあります。このスコープは、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 では識別子を二重引用符で囲む必要があります)。

識別子をサニタイズする組み込みの方法はありますか? それともそのままにしておくべきですか?

4

1 に答える 1

3

試しましたquote_column_nameか?何らかの理由で文書化されていませんが、必要なことは行う必要があります。

window_alias = quote_column_name("#{attr}_rankings")
result_alias = quote_column_name("#{attr}_ranking")

PGconn.quote_ident内部的には、 PostgreSQL を使用する場合の呼び出しと同じです。

于 2013-07-03T16:15:57.353 に答える