Найти модели с 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