Когда у меня уже есть данные поддержки, как мне получить PaperClip для создания URL файла без создания экземпляра всего объекта? - PullRequest
0 голосов
/ 30 ноября 2018

Я столкнулся с ситуацией, когда по соображениям производительности я хочу / должен использовать представление для загрузки данных вместо выборки корневого объекта, а затем связанных объектов в запросе N + 1.Вместо того, чтобы повторять этот запрос везде, я хочу закодировать его в виде (используя живописные виды), чтобы я мог повторно использовать базовую логику - вместо того, чтобы копировать весь запрос и затем модифицировать необработанный SQL, я могу использовать представление и затемстандартные методы запросов активной записи.

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

Мой пользовательМодель имеет фотографию, сохраненную с помощью PaperClip.При сериализации моих данных я могу сериализовать это так же легко, как user.photo? ? user.photo.url : nil.К сожалению, так как я не создаю экземпляр пользовательского класса, в то время как у меня есть все компоненты полученного URL (мое представление извлекает всю пользовательскую таблицу и добавляет дополнительные данные), я не уверен, как я могусобрать их вместе, чтобы создать фактический URL.Я не хочу снова вызывать базу данных для создания экземпляра пользовательского объекта, но я не думаю, что смогу создать экземпляр пользовательского объекта с существующими данными столбца.

Мне кажется, что я что-то упустил безумноЗдесь очевиден некоторый способ создания пользовательского объекта с использованием извлеченных данных столбца, просто не видя его.

1 Ответ

0 голосов
/ 30 ноября 2018

Так что это может быть не идеально, но я нашел способ сделать это.

В моем объекте просмотра я имитирую соответствующие методы данных, создавая экземпляр объекта пользователя:

  def photo?
    User.new(user_attributes).photo?
  end

  def photo
    User.new(user_attributes).photo
  end

  def user_attributes
    attributes.slice(* User.column_names)
  end

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

...