Является ли delete_all будет игнорировать условия, которые основаны на таблице соединений? - PullRequest
0 голосов
/ 13 декабря 2018

Я наблюдал ActiveRecord delete_all игнорирует условие таблицы соединений.Это известная проблема сообщества rails?

Запрос:

DesignPartCategory.joins(:category).where(category: {site_id: INDIA}, designpart_uuid: ['123C']).delete_all

Ожидаемый результат:

УДАЛИТЬ ИЗ designpart_category ГДЕ designpart_category. designpart_uuid IN ('123C') И designpart_category.category_id IN (ИНДИЯ);

Фактический результат:

 DELETE FROM `designpart_category` WHERE `designpart_category`.`designpart_uuid` IN (SELECT designpart_uuid FROM (SELECT `designpart_category`.`designpart_uuid` FROM `designpart_category` INNER JOIN `category` ON `category`.`category_id` = `designpart_category`.`category_id` WHERE (category.site_id =INDIA AND designpart_category.designpart_uuid in ('123C'))) __active_record_temp);

В настоящее время delete_all Операция просто игнорирует / отменяет условие таблицы соединений и выполняет оставшуюся часть запроса..

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

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Кажется, в вашем синтаксисе есть опечатка, проверьте это -

DesignPartCategory.joins(:category).where("categories.site_id = ? AND categories.designpart_uuid IN (?)", 'INDIA', ['123C']).delete_all

В качестве альтернативы вы можете попробовать это: -

DesignPartCategory.joins(:category).where(categories: {site_id: 'INDIA', designpart_uuid: (['123C'])}).delete_all

Примечание: - Удалить против уничтожить

0 голосов
/ 13 декабря 2018

delete_all Удаляет условия сопоставления записей без предварительного создания экземпляров записей и, следовательно, не вызывает метод уничтожения и не вызывает обратные вызовы.Так что это не будет принимать во внимание ничего, как join, includes и т.д ... Проверьте документацию

0 голосов
/ 13 декабря 2018

Вы проверили следующее в своем запросе?

 DELETE FROM `designpart_category` 
  WHERE `designpart_category`.`designpart_uuid` IN (
    SELECT designpart_uuid FROM (
      SELECT `designpart_category`.`designpart_uuid` 
      FROM `designpart_category` INNER JOIN `category` 
      ON `category`.`category_id` = `designpart_category`.`category_id` 
      WHERE (category.site_id =INDIA AND designpart_category.designpart_uuid in ('123C')
    )
  ) __active_record_temp
);

Он фильтрует по вашему запросу на соединение, проверьте запрос, запущенный в IN

...