Получить все записи без вложений - PullRequest
0 голосов
/ 23 сентября 2019

Учитывая модель с ActiveStorage

class Report
  has_one :report_file
end

class ReportFile
  belongs_to :report
  has_one_attached :file
end

Как я могу получить все отчеты, где файл в ReportFile не прикреплен.

Ответы [ 5 ]

1 голос
/ 23 сентября 2019

Ассоциации вложений имеют следующее соглашение об именах: _attachment.В вашем случае это будет file_attachment.

Поскольку это обычная ассоциация ActiveRecord, вы можете делать с ней соединения.Тогда запрос, который вы ищете:

Record.where(id: RecordFile.where.not(id: RecordFile.joins(:file_attachment)).pluck(:record_id)) 
0 голосов
/ 23 сентября 2019
Report.joins("left join report_files on reports.id = report_files.report_id").where("report_files.file is null")

будет работать

0 голосов
/ 23 сентября 2019

В Rails 5 есть метод left_joins, так что вы можете использовать его вместо includes (или eager_load, который работает здесь аналогичным образом), так как в этом случае он подходит лучше.Кроме того, таблица, к которой вы действительно должны присоединиться, чтобы получить то, что вы хотите, - active_storage_attachment, которая связана как file_attachment - ReportFile.Таким образом, я думаю, что лучший способ получить то, что вы хотите, это:

Report.left_joins(report_file: :file_attachment).where(active_storage_attachments: { id: nil })
0 голосов
/ 23 сентября 2019

Report.includes (: report_files) .where ('report_files.file =?', Nil)

Ссылка: https://apidock.com/rails/ActiveRecord/QueryMethods/includes

0 голосов
/ 23 сентября 2019
Report.eager_load(:report_file).where(report_file: {file: nil})

должно работать

...