我有以下用户,公司,调查,问题和答案的模型。
has_many
调查has_many
用户has_many
个问题has_many
答案has_many
答案因此,该公司有一些用户和一些调查。这些调查有一些问题,每个问题都有一些答案,答案来自某些用户。
我想要做的是检查上一次调查,并获得未在调查中回答任何问题的特定用户。
我尝试使用每个循环完成该操作,循环遍历公司用户,然后循环查看上一次调查中的每个用户问题,然后循环回答,让用户回答至少一个问题并将其插入数组中,在这些循环之后,我得到两个数组之间的区别,只得到没有回答任何问题的用户。这种方法运行良好,但我认为有更好的方法,可能使用范围或嵌套范围。除了这种循环方式,我只想要一种简洁明了的方式。顺便说一下,问题需要一个更好的标题:)
current_company = Company.find(current_user.company_id)
has_answer = false
company_users = []
users_whom_answered = []
current_company.users.each {|u| company_users << u}
current_company.users.each do |user|
Survey.last.questions.each do |question|
question.answers.each do |answer|
if answer.user_id == user.id
has_answer = true
users_whom_answered << user
break
end
end
break if has_answer
end
end
result = company_users - users_whom_answered
答案 0 :(得分:0)
您可以尝试以下方法吗?
last_survey_id = Survey.last.id
scope = User.includes(answers: :questions)
scope = scope.where(answers: { user_id: nil })
scope = scope.where(questions: { survey_id: last_survey_id })
我不确定它是否会检索至少回答1个问题的用户,或者是否会检索完全没有回答任何问题的用户..