😇

(Rails)これはハマるよ find_by_sql

2024/07/20に公開

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

別の良い案があれば教えてほしいです

Discussion