2014-12-03 2 views
5

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

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

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

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

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

... но в случае ActiveAdmin.CSVBuilder, там не кажется, способ достичь обследования.

Возможно, мне легче просто сделать это в моем собственном контроллере?

+0

Я оставляю этот вопрос открытым, но в конце концов я сделал собственный экспорт CSV в моем собственном контроллере, и оставили ActiveAdmin вне. – pjmorse

ответ

2

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

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