2013-03-19 4 views
1

У меня есть приложение RoR и у меня есть Фото модель, которая принадлежит Автомобиль.Rails: полиморфная модель или разные модели для разных размеров изображений?

Фото сохраняет изображение, размер которого уменьшен на 200x200>.

Теперь я должен добавить еще одно сущность с изображениями другого типа в мое приложение (CarModel класс и его фотографии).

Было бы неплохо, если бы я мог использовать Фото через полиморфные ассоциации с другими моделями. НО: похоже, мне придется использовать еще один тип миниатюр для этого класса (не 200x200>).

Что мне делать?

  1. Создайте CarModelPhoto класс и используйте его с моделью автомобиля?
  2. Добавить ассоциации polymorphc, чтобы Фотография могла принадлежать другим классам, которые Car.
  3. Используйте инструменты (например, Blitline или Cloudinary), которые изменяют размер изображений «на лету», так что изображение фото перестает быть ограниченным размером 200x200 пикселей. - Но я храню изображения на S3 - похоже, было бы плохо для производительности.

ответ

1

Это зависит от того, как вам нужно реализовать ваши 2 модели изображения, вы в основном имеют 2 approachs

DRY: если вы планируете реализовать подобную функциональность для обеих ваших моделей изображений, то вы не должны повторить себя и создать только один полиморфный модель

свой код коротким: Если 2 фото модели будут реализовывать различные функциональные возможности, лучше разделить их, чтобы держать ваш код чистый и легко читать и поддерживать

и, вы, конечно, уже знаете , но вы c создайте другой стиль для ваших геометрий, поэтому, если вы выберете полиморфный способ, вам просто нужно найти разные имена: thumbnail_car,: thumbnail_car_model и т. д.

2

Использовать STI (однонаправленное наследование), сделанное отдельно модель CarPhoto, унаследованная от Photo модель и переопределяющие методы модели фото. Модель CarPhoto использует те же таблицы фотографий.

class CarPhoto < Photo 
    # In this override the photo model methods and validations of you car's photo. 
end 

Я думаю, это поможет вам.

+0

Это хороший ответ, вы получили мой голос, уважаемый коллега :) – Benj

+0

Спасибо, Бенджамин :) –

1
  1. Вы также мог бы пойти по пути, в котором вы указуете размер фото в вашей Фото модели, указав длину и ширина которой вы бы заселить при изменении размера сервера изображений перед тем, как сохранить изображение.

  2. Сохраните две версии изображения. Миниатюра и больший размер. Вы получите больше файлов на S3, но пространство будет дешевым - и это гораздо менее интенсивно в отношении рендеринга. Имея два размера, вы также избавляетесь от решения сокращений разрешений для эскизов, которые будут выглядеть менее желательными.

Например, вы можете настроить модель как таковую:

Photo 
    name 
    file_type 

Так monkey.png, вы бы Photo(name: "monkey", file_type: "png") Тогда вы бы изменить размер изображения до нужного большой и сохраните его как «monkey_large.png» и миниатюру «monkey_thumb.png» (или, альтернативно, сохраните «monkey.png» в двух отдельных каталогах large/ и thumb/).

Так во время отображения, вы можете иметь метод на фото делает простую конкатенацию (используя другой метод каталога для сохранения изображений):

def image_path_thumbnail 
    "#{<s3 path>/thumb/#{image_name}.{image_file_type}" 
end 

def image_path_large 
    "#{<s3 path>/large/#{image_name}.{image_file_type}" 
end 

Кроме того, взглянуть на PaperClip для загрузки файлов. У них есть интеграция S3, и в Интернете существует множество обучающих программ.

Смежные вопросы