2014-12-03 16 views
5

Đây là với ActiveAdmin 0.4.3. Ứng dụng của chúng tôi chạy Khảo sát ý kiến, có thể có số lượng SurveyQuestions tùy ý. Khi người dùng điền vào một bản khảo sát, một cá thể người dùng UserSurvey được tạo ra, trong đó has_many SurveyComments, một cho mỗi SurveyQuestions của Khảo sát.Xuất số cột động trong ActiveAdmin CSV

Kết quả của điều này là cho bất kỳ Khảo sát cụ thể nào, tất cả các trường hợp người dùng UserSurvey sẽ có cùng số lượng SurveyComments, nhưng giữa các cuộc khảo sát con số này có thể thay đổi.

Có thể xuất CSV ActiveAdmin để xử lý UserSurveyComments theo cách này, sao cho có các cột cho Người dùng, Khảo sát và sau đó là mỗi lần khảo sát lần lượt? Việc xuất khẩu được khảo sát theo phạm vi khảo sát, do đó mỗi hàng có cùng một cột, nhưng xuất khẩu cụ thể có thể có một số khác nhau.

Những gì tôi muốn làm là một cái gì đó giống như

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

... nhưng trong trường hợp ActiveAdmin.CSVBuilder, có vẻ không phải là một cách để đạt được điều tra.

Có lẽ tôi dễ dàng thực hiện việc này trong bộ điều khiển của riêng mình?

+0

Tôi sẽ xuất hiện câu hỏi này trong bộ điều khiển của riêng mình và để ActiveAdmin hết. – pjmorse

Trả lời

2

Tôi hiểu mô hình của bạn là tương tự như

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 

Bên trong khối csv, @collection chứa danh sách các đối tượng được lọc cho đầu ra. Trong cấu hình, bạn có thể đăng ký UserSurveyComment theo cách tương tự như sau:

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