У меня странный случай, когда ActiveRecord_Relation
магия делает что-то непреднамеренное.Учитывая следующее:
comment = Comment.find(params[:id])
# select only the original commenter's comments that match two scenarios
related_comments = comment.where(something: params[:something)
.union(comment.where(something_else: params[:something_else]))
.where(user_id: comment.user_id)
related_comments.count
#=> 4
related_comments.update_all(receive_notifications: true)
#=> SQL (3.9ms) UPDATE "comments" SET "receive_notifications" = 't'
#=> WHERE "comments"."user_id" = $1 [["user_id", 11]] [sql_query]
#=> 12
Судя по всему, .update_all
выполняет один SQL-запрос, который обновляет все комментарии с user_id
из 11. Технически .where(user_id: 11)
был последним запросом., но не должен ли он выполнять SQL-запрос только для отношений related_comments
?
У меня есть обходной путь, где я мог бы сделать это, но это потребовало бы двух SQL-запросов и кажется чрезмерно громоздким, чем необходимо:
comment = Comment.find(params[:id])
# same as above
related_comment_ids = comment.where(something: params[:something)
.union(comment.where(something_else: params[:something_else]))
.where(user_id: comment.user_id).pluck(:id)
#=> [12, 14, 17, 18]
Comment.where(id: related_comment_ids).update_all(receive_notifications: true)
#=> SQL (5.7ms) UPDATE "comments" SET "receive_notifications" = 't'
#=> WHERE "comments"."id" IN (18, 14, 17, 12) [sql_query]
#=> 4