Экспорт динамического количества столбцов в ActiveAdmin CSV

108
11

Это с ActiveAdmin 0.4.3. Наше приложение запускает опросы, которые могут иметь произвольное количество SurveyQuestions. Когда пользователь заполняет опрос, создается экземпляр UserSurveyComment, который has_many SurveyComments, по одному для каждого опроса Survey SurveyQuestions.


В результате этого для любого данного опроса все экземпляры UserSurveyComment будут иметь одинаковое количество SurveyComments, но между опросами это число может меняться.


Возможно ли для экспорта ActiveSQL CSV обработать UserSurveyComments таким образом, чтобы в свою очередь были столбцы для пользователя, опроса, а затем каждого опроса? Экспортирование охвачено Обзором, поэтому каждая строка имеет одинаковые столбцы, но конкретный экспорт может иметь другое число.


То, что я хотел бы сделать, это что-то вроде


survey.survey_questions.each do |sq|
column "Question" { |q| q.survey_comments.where(survey_question_id: sq.id).first.submitted_text }
end

... но в экземпляре ActiveAdmin.CSVBuilder, похоже, нет возможности добраться до Обзора.


Может, мне просто проще сделать это в моем собственном контроллере?

спросил(а) 2021-01-25T18:05:01+03:00 4 месяца, 4 недели назад
1
Решение
78

Я понимаю, что ваша модель похожа на


class Survey < ActiveRecord::Base
has_many :user_survey_comments
has_many :survey_questions
end

class SurveyQuestion < ActiveRecord::Base

attr_accessor :name

belongs_to :survey
has_many :survey_comments
end

class UserSurveyComments < ActiveRecord::Base
belongs_to :survey
has_many :survey_comments
end

class SurveyComments < ActiveRecord::Base

attr_accessor :content

belongs_to :user_survey_comments
belongs_to :survey_question
end

Внутри блока csv @collection содержит список объектов, отфильтрованных для вывода. В конфигурации вы можете зарегистрировать UserSurveyComment следующим образом:


ActiveAdmin.register UserSurveyComment do
csv do

column(:survey)

visited_surveys = Set[]

@collection.each do |user_survey_comment|

next if visited_surveys.include?(user_survey_comment.survey)
visited_surveys.add(user_survey_comment.survey)

user_survey_comment.survey.survey_questions do |question|
column(question.name) do |user_survey_comment|
user_survey_comment
.survey_comments
.find_by(survey_question_id=question.id)
.try(:response){''}
end
end
end
end
end

ответил(а) 2021-01-25T18:05:01+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема