Найти модели с PaperTrail, включенным в приложение Rails

Я внедряю форму в Rails для поиска предыдущих версий версий записей, реализованных с помощью PaperTrail gem. Форма будет содержать раскрывающееся меню для типа объекта (т.е. модели), поэтому мне нужен массив имен моделей, в которые включен PaperTrail, который может измениться в будущем, поэтому я хочу избежать жесткого кодирования, чтобы заполнить выбранные значения. К сожалению, я пока не добился успеха; Я не смог найти ничего в Документах PaperTrail, и #reflect_on_all_associations не работает.

Любые предложения будут ценны.

2 ответа

Незначительное улучшение исходного ответа:

      ActiveRecord::Base.descendants.reduce([]) do |arr, model| 
  PaperTrail.request.enabled_for_model?(model) ? arr.push(model.name) : arr
end

Обратите внимание, что исходное решение привело к повторяющимся устаревшим предупреждениям:

ПРЕДУПРЕЖДЕНИЕ ОБ УСТАРЕНИИ: MyModel.paper_trail.enabled? устарело, используйте PaperTrail.request.enabled_for_model?(MyModel). Этот новый API дает понять, что это параметр, специфичный для текущего запроса, а не для всех потоков. Кроме того, все остальные переменные запроса теперь проходят через то же самое. requestметод, поэтому этот новый API более согласован. (звонок из блока по адресу (pry):69)

Я нашел решение вскоре после публикации. Я перебрал потомков ActiveRecord::Base (это будет ApplicationRecord для приложений Rails 5), все модели которого наследуются и используют #reduce с помощью вспомогательной функции, включенной в PaperTrail (а именно: paper_trail.enabled?).

ActiveRecord::Base.descendants.reduce([]) do |arr, model| 
  model.paper_trail.enabled? ? arr.push(model.name) : arr
end
Другие вопросы по тегам