Оптимізація генерації змінних зображень в Rails 6 з використанням Active Storage

Оптимізація генерації змінних зображень в Rails 6 з використанням Active Storage

7 Березня 2024 в 23:09 21

У розробці веб-додатків на Ruby on Rails однією з найпоширеніших задач є робота з зображеннями. Завдяки Active Storage, вбудованому засобу управління файлами, обробка та зберігання зображень стає простішою. Однак при використанні змінних зображень можуть виникати проблеми, особливо якщо вони зберігаються в зовнішньому сховищі, такому як Azure Blob Storage.

Проблема, яку ви описали, пов’язана з отриманням винятку ActiveRecord::NotNullViolation при спробі створити змінну зображення за допомогою Active Storage. При використанні методу variant для генерації змінної версії зображення та подальшої спроби отримати його URL виникає виняток через відсутність обов’язкового поля record_id в таблиці active_storage_attachments.

Існують різні способи вирішення цієї проблеми. Один з них – змінити спосіб отримання зображення так, щоб воно завантажувалося разом з об’єктом, з яким воно пов’язане, замість безпосереднього доступу до сховища. Це може бути здійснено, наприклад, шляхом використання асоціацій між моделями та методу has_one_attached для прикріплення зображення до об’єкту моделі.

Ще одним способом є використання кешування змінних зображень. При цьому зображення генерується лише один раз та кешується для подальшого використання. Це дозволяє уникнути зайвих операцій генерації та зменшити навантаження на сервер.

Також можна розглянути можливість використання сторонніх сервісів для обробки та зберігання зображень, які мають вбудовану підтримку генерації змінних версій. Наприклад, Amazon S3 або Google Cloud Storage надають інструменти для автоматичної генерації змінних зображень без необхідності вручну налаштовувати цю функціональність.

У кінці, вибір конкретного рішення залежить від ваших потреб та умов конкретного проекту. Важливо збалансувати ефективність та зручність використання з вимогами до продукту та обмеженнями інфраструктури.