2014-12-03 7 views
5

Dies ist mit ActiveAdmin 0.4.3. Unsere Anwendung führt Umfragen durch, die eine beliebige Anzahl von SurveyQuestions enthalten können. Wenn ein Benutzer eine Umfrage ausfüllt, wird eine UserSurveyComment-Instanz erstellt, die has_many SurveyComments lautet, eine für jede SurveyQuestions-Umfrage der Umfrage.Dynamische Anzahl der Spalten in ActiveAdmin CSV exportieren

Das Ergebnis davon ist, dass für jede gegebene Umfrage alle UserSurveyComment-Instanzen die gleiche Anzahl von Vermessungskommentaren haben, aber zwischen Umfragen kann diese Anzahl variieren.

Ist es möglich, dass der CSV-Export von ActiveAdmin UserSurveyComments auf diese Weise behandelt, sodass es Spalten für den Benutzer, die Umfrage und dann für jede Umfrage gibt? Der Export wird nach Vermessung gegliedert, so dass jede Zeile dieselben Spalten hat, aber bestimmte Exporte möglicherweise eine andere Nummer haben.

Was Ich mag würde, ist, etwas zu tun wie

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

... aber innerhalb der ActiveAdmin.CSVBuilder Beispiel scheint es keinen Weg, um die Umfrage zu erreichen.

Vielleicht ist es einfacher für mich, dies nur in meinem eigenen Controller zu tun?

+0

Ich werde diese Frage offen lassen, aber am Ende habe ich einen eigenen CSV-Export in meinem eigenen Controller und links ActiveAdmin aus. – pjmorse

Antwort

2

Ich verstehe Ihr Modell

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 

Im Inneren des csv Block ähnlich, @collection die Liste der Objekte enthält für die Ausgabe gefiltert. In der Konfiguration können Sie UserSurveyComment in ähnlicher Weise wie folgt registrieren:

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