This is with ActiveAdmin 0.4.3. Our application runs Surveys, which may have an arbitrary number of SurveyQuestions. When a user fills in a Survey, a UserSurveyComment instance is created, which has_many
SurveyComments, one for each of the Survey's SurveyQuestions.
The result of this is that for any given Survey, all the UserSurveyComment instances will have the same number of SurveyComments, but between surveys this number may vary.
Is it possible for the ActiveAdmin CSV export to handle UserSurveyComments in this way, such that there are columns for the User, the Survey, and then each SurveyComment in turn? The export is scoped by Survey, so each row has the same columns, but particular exports may have a different number.
What I'd like to do is something like
survey.survey_questions.each do |sq|
column "Question" { |q| q.survey_comments.where(survey_question_id: sq.id).first.submitted_text }
end
...but within the ActiveAdmin.CSVBuilder instance, there doesn't appear to be a way to reach the Survey.
Maybe it's easier for me to just do this in my own controller?
I understand your model to be similar to
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
Inside the csv
block, @collection
contains the list of objects filtered for output. In the configuration you can register UserSurveyComment
in a similar way as follows:
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With