【问题标题】:Getting specific objects with scopes获取具有范围的特定对象
【发布时间】:2014-04-17 22:30:23
【问题描述】:

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

  • 公司有has_many调查关系
  • 公司有has_many用户关系
  • 该调查与has_many questions 相关
  • 问题与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

【问题讨论】:

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


    【解决方案1】:

    您可以尝试以下方法吗?

    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 个问题的用户,或者是否会检索根本未回答任何问题的用户..

    【讨论】:

      猜你喜欢
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多