Techioz Blog

Ruby on Railsでランサック結果に基づいて再度クエリを実行する方法

概要

コントローラーで次のようなランサック結果を取得した後:

@q = SomeModel.ransack(q)

ransack の結果 (@q) に基づいてもう一度クエリを実行したいと思います。

SELECT * FROM ransack_result WHERE some_field IN ('a', 'b', 'c')

追加のクエリを適用する方法はありますか?

背景情報の詳細については、次を参照してください。

Rails7 では some_field が ActiverRecord::Encryption で暗号化されています。 q[:some_field_in] = [‘a’, ‘b’, ‘c’] を使用して WHERE some_field IN (‘a’, ‘b’, ‘c’) を含めようとすると、それぞれの ‘a’、 「b」、「c」は暗号化されます。

some_field に暗号化された値と暗号化されていない値の両方が含まれる移行期間中であるため、他の条件を維持しながら暗号化されたデータと暗号化されていないデータの両方をクエリしたいと考えています。 ransack は現在、暗号化された属性をサポートしていないため、ransack で提供されている *_in matcher を使用できません。 :’(

または…Rails コントローラーで ransack によって生成された SQL クエリを取得できればいいのですが、そうすれば上記のクエリを追加できるようになります。

解決策

Ransack から取得した結果に基づいて追加のクエリを実行するには、Ransack によって生成された SQL を抽出し、カスタム クエリ条件を「手動で」追加します。

@q = SomeModel.ransack(q)

# obtain generated SQL by Ransack
original_query = @q.result.arel.to_sql

# your manual modifications
custom_condition = "some_field IN ('a', 'b', 'c')"
custom_query = "#{original_query} AND #{custom_condition}"

# perform the SQL query
SomeModel.find_by_sql(custom_query)