ransack で .result(distinct: true) するとエラーになる場合

Rails で手軽に検索機能を作るときに便利な ransack という gem があります。

GitHub - activerecord-hackery/ransack: Object-based searching.

シンプルな書き方としてコントローラーに以下のように書けば動くとある。

def index
  @q = Person.ransack(params[:q])
  @people = @q.result(distinct: true)
end

そもそもクエリ結果が unique なら (distinct: true) いらなくないですか?

DB が PostgreSQL で、複合主キーのあるテーブルに対して @q.result(distinct: true) したところ、生成されたSQLSELECT COUNT(DISTINCT ) FROM tablename~~ で、エラーになる。そりゃ DISTINCT 対象カラムが指定されてなきゃエラーになるわな。なぜ指定されないのだろう。

ransack の説明ページを見てると、Problem with DISTINCT selects という項目があり、ここにあるように何等か対策をすればよいのだけど、そもそも元のテーブル内容がuniqueだった場合、DISTINCT いらなくないですか?という話。

上記エラーに対しては、諸々気にしながらとりあえず (distinct: true) 外せば動く。