Rails показывает представления для версий PaperTrail

У меня довольно странный вариант использования PaperTrail. В моем сценарии версия основана на физическом событии. Из-за этого версии моей модели создаются только тогда, когда я говорю.

Из-за вышеизложенного. Я хочу, чтобы эти версии были способны на следующие вещи:

Когда я запускаю что-то вроде Model.all, это должно игнорировать версии, как и ожидалось, но в некоторых случаях я хочу, чтобы версии возвращались как обычно, поэтому мне нужно иметь возможность сделать что-то вроде Model.withVersions, чтобы вернуть все текущие записи и все связанные версии. Это возможно?

Кроме того, мне нужно иметь возможность создать страницу для версий. То есть: Rails Show Action и View.

Как бы я это сделал? Мне нужно создать ссылку на одну из страниц, которая будет выводить что-то похожее на /model/23, что приведет вас на страницу о конкретной версии этого элемента.

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


person rctneil    schedule 27.01.2015    source источник


Ответы (1)


По сути, мы здесь используем тот факт, что PaperTrail добавляет в вашу модель новый метод с именем versions, который возвращает массив из PaperTrail::Version объектов, по одному для каждой версии модели. Для любого из этих объектов версии вы можете вызвать .reify, чтобы получить модель этой версии.

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

hash = {}
Model.all.each { |m| hash[m.id] = m.versions.map(&:reify) }

# so to see the array of all versions of model with id=1
hash[1]

На вашей странице шоу вам нужно будет передать версию в качестве параметра, например. /model/23?version=5, а затем в действии show вы сделаете что-то вроде:

@model = Model.find(params[:id])
if params[:version]
  @model = @model.versions[params[:version]-1].reify
end
person smathy    schedule 28.01.2015
comment
Это очень очень полезно. Я мог бы попытаться добавить маршрут члена к моему ресурсу модели, чтобы полностью интегрировать версии в URL-адрес, если он существует. - person rctneil; 28.01.2015
comment
Скажем, я хочу найти свою модель, но хочу вернуть результаты, включая все версии. В настоящее время я использую searchkick и запускаю Model.search(). Я так понимаю, что мне нужно будет предварительно проверить все версии и каким-то образом добавить их в индекс. Хм, запутанная вещь! - person rctneil; 28.01.2015
comment
@rctneil - знаете, здесь, в StackOverflow, есть еще один способ указать, что ответ был действительно полезным. - person smathy; 28.01.2015
comment
Абсолютно. Я не собирался оставлять его непринятым. Я приношу извинения. - person rctneil; 28.01.2015
comment
Связанный вопрос: у меня есть страница, которая reify представляет собой версию модели и выводит ее с использованием части, которую я сделал для этой модели. Затем этот фрагмент включает вспомогательную функцию пути link_to rails, например model_path(model). Ссылка, которая выводится из этого, указывает на последнюю версию, а не на овеществленную. Извините, это довольно запутанно. Есть идеи? - person rctneil; 28.01.2015
comment
Я не знаю, как работает searchkick, но да, я думаю, вам придется делать то, что вы сказали. Как я упоминал во второй части вашего вопроса выше, вам нужно будет включить версию в этот помощник пути, например model_path( model, version: model.version) - person smathy; 28.01.2015