2016-05-23 2 views
0

У меня есть приложение Rails с Comment модели, и Notification модель, где каждый комментарий has_many :notificationsРельсы: has_many в сроки

Я хочу создать dependent: :destroy на этой has_many отношения. Проблема в том, что таблица уведомлений ОГРОМНАЯ (где-то порядка 20 миллионов записей). Поэтому в любое время, когда я пытаюсь уничтожить комментарий, он тратит несколько минут на просмотр таблицы уведомлений.

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

Все извещения созданы в течение 24 часов комментария ДЕТСКОГО created_at - Так что я решил, чтобы ускорить отношения, я мог бы просто добавить что-то вроде

has_many :notifications, -> { where(created_at: created_at..(created_at + 1.day)) }, dependent: :destroy 

Но, конечно, не работает, потому что created_at вызывается на экземпляр Notification::ActiveRecord_Relation, а не на исходный комментарий.

Можно ли ссылаться на атрибут комментария в запросе has_many этого комментария?

+0

Не отвечая на ваш вопрос, но вам нужно «: уничтожить» уведомления или вы могли бы:: удалить их? это должно быть намного быстрее. В качестве альтернативы вы можете удалить зависимость и отключить фоновое задание для их очистки. –

ответ

2

В определении ассоциации, вы можете ссылаться на комментарий передается в качестве параметра блока:

has_many :notifications, 
      -> (comment) { where(created_at: comment.created_at..(comment.created_at + 1.day)) }, 
      dependent: :destroy 

ВИДЕТЬ Accessing the owner object раздел документации для получения дополнительной информации.

+0

Woah, thats awesome. – BananaNeil

1

Использование joins для ссылки на дочерний класс в где заявление:

has_many :notifications, -> { joins(:notifications).where(notifications: { created_at: created_at..(created_at + 1.day) }, dependent: :destroy 
+0

Спасибо за ответ здесь, это должно сработать, но я думаю, что ответ @ BoraMa немного проще и немного более эффективен, потому что ему не нужно делать соединение и вместо этого использует 'rails magic'. – BananaNeil

Смежные вопросы