Форма пакетного действия ActiveAdmin с записями из нескольких классов в качестве входных данных - PullRequest
0 голосов
/ 04 октября 2018

Следуя руководству по пакетным действиям от activeadmin, можно создавать формы разных типов.Я хочу, чтобы в форме были записи разных классов моделей.

У меня есть три класса: Shop, RecordingShop и DistributionChain.DistributionChain может иметь один или несколько Shop с или RecordingShop с, но также не может иметь ни одного из них.

В таблице индекса Scores я хочу показать пакетное действие экспорта и распознатьк какому классу относится запись формы (* Shop, RecordingShop или DistributionChain)

Можно ли сделать что-то вроде:

ActiveAdmin.register Score, as: 'Delivery' do
  ...
  batch_action :export, form: {shops: (DistributionChain.all + Shop.not_distribution_chain).collect{ |e| [e.name, e.id, e.class.name]} } do |ids, inputs|
    ...
  end
  ...
end

, чтобы класс былтретий параметр во вложенном массиве, после имени элемента и идентификатора, и включить его в переменную inputs?

1 Ответ

0 голосов
/ 05 октября 2018

решаемая.Я нашел способ объявления переменных в самом коде ресурса администратора.

ActiveAdmin.register Score, as: 'Delivery' do
  ...
  EXPORT_INPUTS = DistributionChain.all + Shop.not_distribution_chain
  EXPORT_INPUTS_DATA = EXPORT_INPUTS.collect.with_index{ |e, i| [e.name, i] }
  ...
  batch_action :export, form: {shops: EXPORT_INPUTS_DATA } do |ids, inputs|
    element = EXPORT_INPUTS[inputs['shops'].to_i]
    ...
  end
  ...
end

EXPORT_INPUTS содержит фактический набор элементов из нескольких классов.

EXPORT_INPUTS_DATA - это переменная (массив) для использования в форме и имеет имя и индекс элементов в массиве.Выбранный индекс может быть получен позже, поскольку inputs['shops'] и EXPORT_INPUTS[inputs['shops'].to_i] точно соответствуют требуемому элементу.

NB : EXPORT_INPUTS_DATA должно быть определено вне действия.Если вы напишите

batch_action :export, form: {shops: EXPORT_INPUTS.collect.with_index{ |e, i| [e.name, i] } }

напрямую, inputs['shops'] будет равен только идентификатору элемента в соответствующем классе, который нам ничего не говорит.

...