複雑なクエリを書きたい時、 SQLを直書きできる find_by_sql
メソッドを使うのだが、配列の引数を渡すケースがあったときに、その配列が空だと正常にデータを取得できなくなるよう。
例えば、こんな感じで、1みたいに配列に値があればうまく動作するのだが、2のように空だとうまくいかないっぽい。
# 1. arg_user_ids = [1,2,3] # 2. arg_user_ids = [] query = ( <<~SQL SELECT users.* FROM users INNER JOIN posts ON posts.user_id = users.id WHERE posts.user_id NOT IN (:exclude_post_user_ids) SQL ) User.find_by_sql([query, { exclude_post_user_ids: arg_user_ids }])
だから、微妙なんだけど、分岐させてクエリを変える必要があるみたい?(別案知ってたら教えてほしい)
arg_user_ids = [] if arg_user_ids.blank? query = ( <<~SQL SELECT users.* FROM users INNER JOIN posts ON posts.user_id = users.id -- ここ削除 SQL ) else query = ( <<~SQL SELECT users.* FROM users INNER JOIN posts ON posts.user_id = users.id WHERE posts.user_id NOT IN (:exclude_user_ids) SQL ) end User.find_by_sql([query, { exclude_post_user_ids: arg_user_ids }])
せめて、エラーか警告かほしいところ。。ではある。