#ruby-on-rails #pluck
#рубин на рельсах #срывать
Вопрос:
Моя модель пользователя выглядит так. У пользователя есть много прикрепленных резюме.
class User lt; ApplicationRecord has_many_attached :resumes, dependent: :destroy end
Теперь в другой форме я хочу показать список резюме, загруженных пользователем, в порядке убывания. Мне удается сделать это, используя следующий код.
lt;%= f.select :resume, options_for_select(@user.resumes.includes(:blob).references(:blob).pluck(:filename, :created_at).reverse.map{ |e| e.join(' - ') }), prompt: '-- Select --', class: 'form-control' %gt;
Так что теперь в моем раскрывающемся списке «Выбрать» я могу видеть все загруженные резюме в порядке убывания. Мое выпадающее меню выглядит так file_name.pdf - 2021-11-30 03-59-59 UTC
. Я не хочу показывать время в выпадающем списке. Я просто хочу отформатировать его и показать дату с именем файла, что-то вроде этого john_resume.pdf 11/11/2021
.
Итак, мой вопрос в том, как я могу отформатировать дату при использовании pluck ?
Комментарии:
1. Вы должны как можно чаще избегать выполнения запросов к базе данных в своем представлении — ваши представления должны просто получать данные от контроллера и отображать их максимально простым способом. Представления-это беспорядочная мешанина разметки и ERB, и это рецепт для очень медленных приложений, так как вы скоро потеряете представление о том, какие запросы к базе данных выполняет каждое действие. Переместите запрос в контроллер, и вы, возможно, захотите пересмотреть использование pluck, так как вам придется анализировать даты, а не просто работать с моделями.
2. Также вместо того и другого
include
иreferences
просто используйтеeager_load
. Вот что происходит в любом случае.
Ответ №1:
lt;% options = @user.resumes.includes(:blob).references(:blob).pluck(:filename, :created_at).reverse.map { |e| filename = e.first; created_at = e.last; [filename, created_at.strftime('%d/%m/%Y')].join(' - ') }%gt; lt;%= f.select :resume, options_for_select(options), prompt: '-- Select --', class: 'form-control' %gt;