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)
したところ、生成されたSQL が SELECT COUNT(DISTINCT ) FROM tablename~~
で、エラーになる。そりゃ DISTINCT 対象カラムが指定されてなきゃエラーになるわな。なぜ指定されないのだろう。
ransack の説明ページを見てると、Problem with DISTINCT selects という項目があり、ここにあるように何等か対策をすればよいのだけど、そもそも元のテーブル内容がuniqueだった場合、DISTINCT いらなくないですか?という話。
上記エラーに対しては、諸々気にしながらとりあえず (distinct: true)
外せば動く。