Почему Rails ActiveRelation.update_all обновляет другой набор записей? - PullRequest
0 голосов
/ 23 января 2019

У меня странный случай, когда 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...