Обновите всех детей одного из родителей и детей этого ребенка - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь обновить детей родителей как можно эффективнее. Это не должно быть рекурсивным, потому что архитектура таблиц известна.

Таблицы:

  • В группе много сообщений
  • В сообщении много комментариев
  • В комментарии много ответов

Цель - обновить сообщения группы, а также их комментарии и так далее. Все связанные записи должны быть обновлены (удаленный файл, который имеет тип DateTime во всех таблицах).

Кроме того, Ruby не обязателен, его можно писать на SQL (Postgresql).

Что у меня есть сейчас:

group.posts.map(&:comments).flatten.map{ |c| c.touch }

для обновления только комментариев.

Есть ли лучший способ обновить как минимальное количество возможных запросов?

[SQL] Рекурсив CTE здесь не применим?

Схема SQL:

Groups:
ID Name Deleted_at
1 Stackoverflow null
2 Programming null

Posts:
ID Title Deleted_at Group_id
1 Stackoverflowqestion null 1
2 StupidQuestionOnStack null 1

Comments:
ID Body Deleted_at post_id
1 ThaIsStupid null 1

Replies:
ID Body Deleted_at comment_id
1 yep null 1

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Лучше использовать следующее соотношение,

class Group < ApplicationRecord

  has_many :comments, through: :posts

end

Рельсы <6,0 </strong>

group.comments.map(&:touch)

# or with single SQL query
group.comments.update_all(updated_at: Time.now)

Рельсы 6,0

group.comments.touch_all

Для получения дополнительной информации вы можете прочитать это doc

0 голосов
/ 10 октября 2019

Я полагаю, что вы можете использовать рельсовые ассоциации и обратные вызовы для решения этой проблемы. например, в вашей групповой модели

class Group < ApplicationRecord
  has_many :posts
  has_many :comments, through: :posts # add this association

  after_update :update_comments # will be called after `Group` object updates successfully

  def update_comments
    comments.map(&:touch) # can apply required logic here
  end
end

аналогичным образом вы можете создать цепочку обратных вызовов (например, добавить обратный вызов в модели сообщений) для обновления других записей в соответствии с вашим требованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...