Рекомендации по обработке изображений в Модели с замком ActiveRecord/Монорельс

StackOverflow https://stackoverflow.com/questions/1186459

Вопрос

Нашей модели "пользователя" нужна небольшая фотография профиля, и я не совсем уверен, как с этим справиться.Конечно, мы могли бы просто сохранить его в папку на диске и сохранить путь / имя файла к базе данных, но я думаю, что предпочел бы сохранить его в самой базе данных.

Моей первой мыслью было создать свойство для модели, подобное этому:

[Property] 
public byte[] ProfilePicture
{
  get;
  set;
}

Но мне определенно кажется, что мне придется пройти долгий путь, чтобы заставить это работать таким образом - получить массив байтов из базы данных, затем преобразовать его в изображение с помощью какого-то обработчика.

Кто-нибудь видел хороший учебник о том, как обращаться с подобными вещами?Кажется, что это было бы достаточно распространенным требованием, чтобы я нашел что-то конкретное для монорельса, но пока мои поиски ни к чему не привели.

Это было полезно?

Решение

О хранении изображений в базе данных или файлах см. этот вопрос.

Если вы решили сохранить его в базе данных, самое главное, чтобы вы не надо извлеките byte[] каждый раз, когда вы запрашиваете Пользователя, это потенциально может привести к большому объему данных и проблеме с производительностью.Для этого вы могли бы либо сохранить изображение в другой таблице, либо сопоставить byte[] к другому объекту с той же таблицей (при условии, что у пользователя может быть только одно изображение):

[ActiveRecord("users")]
public class UserWithoutPicture {
  [PrimaryKey]
  public virtual int Id {get;set;}
...
  [BelongsTo]
  public virtual UserProfilePicture ProfilePicture {get;set;}
}

[ActiveRecord("users")]
public class UserProfilePicture {
  [PrimaryKey]
  public virtual int Id {get;set;}

  [Property]
  public virtual byte[] Image {get;set;}
}

Однако у этого было бы несколько странное поведение.Например, для любого данного пользователя ProfilePicture никогда не будет равняться нулю.На самом деле вы бы не стали вставлять или удалять UserProfilePicture поскольку на самом деле это пользователь, вместо этого вы всегда будете обновляться.И вы повлекли бы за собой дополнительное присоединение, и вы должны быть осведомлены о ВЫБЕРИТЕ N+1.Это просто не укладывается у меня в голове, полностью непроверенный.

Заключение:хранение изображений в другой таблице гораздо более гибко.

Если вы хотите иметь дело с удобным Image вместо сырого byte[], реализовать IUserType.Но помните, что это изображение является IDisposable, и оно будет очень тяжело чтобы избавиться от него в нужное время.

Реализовать контроллер монорельса, который возвращает изображение, довольно просто...просто используй [ARFetch] чтобы получить UserProfilePicture по идентификатору и запишите в поток ответов с соответствующим типом содержимого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top