获取具有范围的特定对象

时间:2014-04-17 13:47:02

标签: ruby-on-rails ruby activerecord ruby-on-rails-4

我有以下用户,公司,调查,问题和答案的模型。

  • 公司与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

1 个答案:

答案 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个问题的用户,或者是否会检索完全没有回答任何问题的用户..