ActiveRecord для выполнения одного оператора SQL для уничтожения на основе включенной зависимой модели - PullRequest
1 голос
/ 22 января 2020

Рассмотрим сценарий, в котором у меня есть модель ActiveRecord Document, которая имеет отношение has_many с независимой моделью File. Я могу загрузить файлы для данного родительского элемента Document с помощью запроса, такого как:

document_with_files = Document.includes(:files).find_by(document_id: document_id)

. Есть ли способ в ActiveRecord удалить родительский документ, если в качестве части файла имеется только один дочерний файл? то же самое SQL заявление? Я пробовал что-то вроде следующего, и это довольно близко:

Document.select("document.*, COUNT(files.id) file_count")
        .joins(:files)
        .group("document.id")
        .where(document_id: document_id_to_be_found)
        .where("file_count = ?", 1)

Кажется, что мое назначение file_count не распознается в последнем предложении .where.

1 Ответ

0 голосов
/ 22 января 2020

Для вашего сценария следующий код может найти документ, который имеет только один дочерний файл.

Document.joins(:files).group('documents.id').having('count(files.id) = 1')

И если вы хотите удалить родительский документ, если есть только один дочерний файл как часть того же оператора SQL.

Document.joins(:files)
        .group('documents.id')
        .having('count(files.id) = 1')
        .find_by(document_id: document_id_to_be_found)
        .destroy
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...