В моем приложении на Rails 5, создание JSON API и использование Activestorage для моих вложений:
Чтобы избежать доступа к вложению, которое не существует, я использую это если условие, как показано в этомответ но, к сожалению, это, если условие заставляет SQL-запрос проверить доступность вложения или нет, что вызывает n + 1 запрос, хотя я уже включил (предварительно загрузил) вложения для записей, которые у меня есть
Как проверить, существуют ли вложения в записи, не обращаясь к БД, если я уже предварительно загрузил вложения?
Я пытался использовать .nil? но это даст ложный положительный результат, что есть вложение, даже если нет (как показано ниже)
ActionView::Template::Error (to_model delegated to attachment, but attachment is nil):
if !product.logo.nil?
json.logo_img url_for(product.logo)
.attached?
проверка работает, но вызывает n + 1 запросов:
if product.logo.attached?
json.logo_img url_for(product.logo)
Так что, хотя приведенный ниже код выглядит очень некрасиво, он работает, предварительно загружая вложения для всех записей одновременно, но при проверке, существует ли вложение =>, это приводит к n + 1 запросам
json.array!(@some_records.includes(integrated_product: [company: [ logo_attachment: :blob ]])) do |one_record|
product ||= one_record.integrated_product
if !product.logo.attached?
json.logo_img url_for(product.logo)
elsif !product.company.logo.attached?
json.logo_img url_for(product.company.logo)
end
....
Будем благодарны за любые мысли о том, как правильно это делать (предварительная загрузка вложений и обход n + 1).
Обновление:
Я хочуиметь всю коллекцию, которую я передал, , включая элементы с и без вложения , в поиске условия, которое проверит, есть ли у уже загруженного элемента вложение или нет, чтобы отобразить изображение, если оноимеет вложение