Удалить несколько таблиц в одном запросе с помощью объединения в рельсы 5 - PullRequest
0 голосов
/ 13 сентября 2018

Это мой запрос в рельсах, я хочу удалить записи из таблицы feed и feed mappings, которые соответствуют определенным условиям в одном запросе. Если я использую destroy_all, он удаляет элементы один за другим, сначала он удалитfeed и затем feed_mappings для каждой записи, тогда как если я могу просто изменить оператор Select в результирующем запросе на Delete feed, feed_mappings, я могу удалить все в одном запросе.Помогите мне решить эту проблему в одном запросе.

Feed.joins(:feed_mappings)
          .joins('inner join notifications on notifications.id = feed_mappings.source_id')
          .joins('inner join user_feedbacks on user_feedbacks.source_id = notifications.picked_for_company')
          .joins('inner join user_feedback_contexts on user_feedback_contexts.user_feedback_id = user_feedbacks.id')
          .where(user_feedbacks: {source_type: 'Company', user_id: user.id},
                 user_feedback_contexts: {context: 'block'},
                 notifications: {user_id: user.id},
                 feed_mappings: {source_type: 'Notifications::Notification'})

Это генерирует

SELECT `feeds`.* FROM   `feeds` 
   INNER JOIN `feed_mappings` 
           ON `feed_mappings`.`feed_id` = `feeds`.`id` 
   INNER JOIN notifications 
           ON notifications.id = feed_mappings.source_id 
   INNER JOIN user_feedbacks 
           ON user_feedbacks.source_id = notifications.picked_for_company 
   INNER JOIN user_feedback_contexts 
           ON user_feedback_contexts.user_feedback_id = user_feedbacks.id 
   WHERE  `user_feedbacks`.`source_type` = 'Company' 
   AND `user_feedbacks`.`user_id` = 6 
   AND `user_feedback_contexts`.`context` = 'block' 
   AND `notifications`.`user_id` = 6 
   AND `feed_mappings`.`source_type` = 'Notifications::Notification' 

Что я хочу вместо

DELETE `feeds`, `feed_mappings` FROM   `feeds` 
   INNER JOIN `feed_mappings` 
           ON `feed_mappings`.`feed_id` = `feeds`.`id` 
   INNER JOIN notifications 
           ON notifications.id = feed_mappings.source_id 
   INNER JOIN user_feedbacks 
           ON user_feedbacks.source_id = notifications.picked_for_company 
   INNER JOIN user_feedback_contexts 
           ON user_feedback_contexts.user_feedback_id = user_feedbacks.id 
   WHERE  `user_feedbacks`.`source_type` = 'Company' 
   AND `user_feedbacks`.`user_id` = 6 
   AND `user_feedback_contexts`.`context` = 'block' 
   AND `notifications`.`user_id` = 6 
   AND `feed_mappings`.`source_type` = 'Notifications::Notification' 

1 Ответ

0 голосов
/ 13 сентября 2018

Все объединения усложняют, но работает ли следующее?

Feed.joins(:feed_mappings)
          .joins('inner join notifications on notifications.id = feed_mappings.source_id')
          .joins('inner join user_feedbacks on user_feedbacks.source_id = notifications.picked_for_company')
          .joins('inner join user_feedback_contexts on user_feedback_contexts.user_feedback_id = user_feedbacks.id')
          .where(user_feedbacks: {source_type: 'Company', user_id: user.id},
                 user_feedback_contexts: {context: 'block'},
                 notifications: {user_id: user.id},
                 feed_mappings: {source_type: 'Notifications::Notification'}).delete_all

FeedMappings.joins('inner join notifications on notifications.id = feed_mappings.source_id')
            .joins('inner join user_feedbacks on user_feedbacks.source_id = notifications.picked_for_company')
            .joins('inner join user_feedback_contexts on user_feedback_contexts.user_feedback_id = user_feedbacks.id')
            .where(user_feedbacks: {source_type: 'Company', user_id: user.id},
                   user_feedback_contexts: {context: 'block'},
                   notifications: {user_id: user.id},
                   feed_mappings: {source_type: 'Notifications::Notification'}).delete_all
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...