OSDN Git Service

テストケースがすべて通るように最適化(MySQLにも対応)
[elecoma/elecoma.git] / app / models / questionnaire.rb
1 class Questionnaire < ActiveRecord::Base
2
3   acts_as_paranoid
4
5   has_many :questions, :dependent => :destroy, :validate => false, :order => 'position ASC'
6   has_many :questionnaire_answers
7
8   validates_presence_of :name
9   validates_presence_of :content
10
11   QUESTION_COUNT = 6
12   QUESTION_CHOICE_COUNT = 8
13   
14   def validate
15     #質問項目のvalidate
16    if questions.size == 0
17       errors.add "dummy","質問がありません"
18    else
19       errors.add "dummy", "質問1がありません" if questions[0] && questions[0].position != 1
20       questions.each_with_index do | question, index |
21         errors.add "dummy", "質問#{question.position}の内容がありません" if question.content.nil?
22         errors.add "dummy", "質問#{question.position}の内容は不正な値です" if !question.content.nil? && question.content.length > 100000
23
24         #選択四肢のvalidate
25         question.question_choices.each_with_index do | question_choice, choice_index |
26           errors.add "dummy", "質問#{question.position}の質問形式が選択されていません" if !question_choice.format && choice_index == 0
27           errors.add "dummy", "質問#{question.position}の選択肢1がありません" if choice_index == 0 && (question_choice.format == QuestionChoice::CHECKBOX || question_choice.format == QuestionChoice::RADIOBUTTON) && question_choice.content.blank? 
28         end
29       end
30     end
31   end
32
33   def init_data
34     self.operation = false
35     QUESTION_COUNT.times do |question_idx|
36       question = Question.new(:content=>nil, :position=>question_idx+1)
37       QUESTION_CHOICE_COUNT.times do |choice_idx|
38         question.question_choices << QuestionChoice.new(:content=>nil, :position=>choice_idx+1)
39       end
40       questions << question
41     end
42   end
43
44   def get_show_questions_data
45     questions_data = []
46     QUESTION_COUNT.times do | question_idx |
47       if question = questions.find(:first, :conditions=>["position = ?", question_idx+1])
48         QUESTION_CHOICE_COUNT.times do | choice_idx |
49           if question_choice = question.question_choices.find(:first, :conditions=>["position = ?", choice_idx+1])          #既存の選択肢があれば取得
50             question.question_choices << question_choice
51           else  #選択肢を新しく追加
52             question.question_choices.build(:content => nil, :position=>choice_idx+1)
53           end
54         end
55
56       else  #質問項目を新しく作る
57         question = Question.new({:content => nil, :position => question_idx+1})
58
59         #選択肢を新しく作る
60         QUESTION_CHOICE_COUNT.times do | choice_idx |
61           question.question_choices << QuestionChoice.new({:content => nil, :position => choice_idx+1, :format => nil})
62         end
63       end
64       questions_data << question
65     end
66     return questions_data
67   end
68
69   def self.csv(id, count)
70     questionnaire = self.find(id)
71     header = get_csv_header(count)
72     f = StringIO.new('', 'w')
73     CSV::Writer.generate(f) do |writer|
74       writer << header
75       questionnaire.questionnaire_answers.each do | questionnaire_answer |
76         row = questionnaire_answer.export_row
77         questionnaire_answer.question_answers.each do |question_answer|
78           row.concat(question_answer.export_row)
79         end
80         writer << row
81       end
82     end
83     f.string
84   end
85
86   private
87
88   def self.get_csv_header(count)
89     header = ["アンケート回答ID",
90               "回答者(姓)",
91               "回答者(名)",
92               "回答者(セイ)",
93               "回答者(メイ)",
94               "回答者ID",
95               "郵便番号1",
96               "郵便番号2",
97               "都道府県名",
98               "市町村名",
99               "町域名",
100               "電話番号1",
101               "電話番号2",
102               "電話番号3",
103               "作成日",
104               "メールアドレス"]
105     
106     count.times do | index |
107       header += ["回答#{index+1}"]
108     end
109     header
110   end
111
112 end