我有一个相对简单的模型设计,用于创建调查、将调查分配给用户并由这些用户填写调查。这一切都很好,但是在从这些调查中检索数据时,我不确定什么是正确的方法,尤其是什么是轨道方式。
我的模型设计如下:(为清楚起见只留下相关代码)
class Survey < ActiveRecord::Base
has_many :survey_sections, dependent: :destroy
has_many :survey_assignments
has_many :participants , :through => :survey_assignments, :source => :user
has_many :survey_responses
end
class SurveySection < ActiveRecord::Base
belongs_to :survey
has_many :survey_questions, dependent: :destroy
has_many :survey_options, dependent: :destroy
end
所以调查分为很多部分,每个部分有很多问题,每个部分都有很多选项,选项基本上是当前部分所有问题的预定义答案。这是设计决定,所以我不需要每个问题都有很多选择......
class SurveyQuestion < ActiveRecord::Base
belongs_to :survey_section
has_many :survey_answers
end
class SurveyAnswer < ActiveRecord::Base
belongs_to :survey_option
belongs_to :survey_question
belongs_to :survey_response
end
class SurveyOption < ActiveRecord::Base
#it has 2 fields 'weight'(int) and 'text'(string)
belongs_to :survey_section
end
医生可以将调查分配给他们的患者,并指定他们可以进行调查的日期。
class SurveyAssignment < ActiveRecord::Base
#has also a field valid_until(date)
belongs_to :user
belongs_to :survey
has_many :survey_responses
end
我也在记录调查回复。因此,每次用户填写表格时,都会在survey_responses 表中创建一条新记录。稍后我将需要这个,因为调度实施,用户可能分配了他应该参加的调查[在此处输入一些数字] X [日|周|月]。
class SurveyResponse < ActiveRecord::Base
belongs_to :survey_assignment
belongs_to :survey
belongs_to :user
has_many :survey_answers
end
现在我需要显示调查结果图表。就像您在代码中看到的那样,结果是整数(请参阅 SurveyOption 类),我需要为特定用户进行的特定调查加起来。所以假设我有一个 user_id 和一个survey_id,现在我想检索所有用户的调查回复,但是对于每个调查回复,我需要他们的答案所具有的权重总和(SurveyOption)。
如果我进行以下查询,我会得到他所有回答的答案总和:
SurveyResponse.joins(:survey_answers => :survey_option).where(user_id: 96, survey_id:63).select("survey_option.weight").sum("weight")
但是我想为那个用户对该调查的每一个响应返回一个数组,就像这样
[[survey_response.created_at.to_i, the_sum_of_weights],[...],[...],....]
那么做这样的事情的最好方法是什么?是否可以在单个查询中完成,如果我认为纯粹是在 sql statemets 中,我认为这可以在单个查询中完成。
如果有人需要我进一步阐述,我们可以在评论中讨论。谢谢你的协助。
我想我想要生成的 sql 语句是:
SELECT survey_responses.id, survey_responses.created_at, SUM (survey_options.weight) FROM "survey_responses" INNER JOIN "survey_answers" ON "survey_answers"."survey_response_id" = "survey_responses"."id" INNER JOIN "survey_options" ON "survey_options"."id" = "survey_answers"."survey_option_id" WHERE "survey_responses"."user_id" = 96 AND "survey_responses"."survey_id" = 64 GROUP BY survey_responses.id, survey_responses.created_at;
我想我快要解决我自己的问题了:)))