😇
(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 }])
別の良い案があれば教えてほしいです
Discussion