プログラマーの雑レポート

脳死で読めるコードを書きたい

(Rails)これはハマるよ find_by_sql

複雑なクエリを書きたい時、 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 }])

せめて、エラーか警告かほしいところ。。ではある。