2014-04-17 4 views
0

J'ai les modèles suivants pour les utilisateurs, les entreprises, les sondages, les questions et réponses.Obtenir des objets spécifiques avec des étendues

  • La société a une relation de has_many enquêtes
  • La société a une relation de has_many utilisateurs
  • L'enquête a une relation de has_many des questions
  • La question a une relation de has_many réponses sur
  • L'utilisateur a une relation de has_many réponses

Donc, d'après cela, l'entreprise a quelques utilisateurs et quelques enquêtes. Ces enquêtes ont quelques questions et chaque question a des réponses, les réponses viennent de certains utilisateurs.

Ce que je veux faire est de vérifier la dernière enquête et obtenir les utilisateurs spécifiques qui n'ont répondu à aucune question sur l'enquête. J'ai essayé d'accomplir cela en utilisant chaque boucle, de faire une boucle sur les utilisateurs de l'entreprise puis de boucler chaque question utilisateur de la dernière enquête puis de boucler sa réponse pour obtenir les utilisateurs qui ont répondu à au moins une question et les insérer dans un tableau , après ces boucles, j'ai la différence entre les deux tableaux pour obtenir seulement les utilisateurs qui n'ont répondu à aucune question. Cette méthode fonctionne bien, mais je pense qu'il existe une meilleure façon de faire cela, peut-être en utilisant des portées ou s'il y a des portées imbriquées. Je veux juste un moyen propre et direct autre que cette façon de boucler. Par ailleurs, la question a besoin d'un meilleur titre :)

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 

Répondre

0

Pouvez-vous essayer ce qui suit?

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 }) 

Je ne suis pas sûr si elle récupère les utilisateurs qui n'ont pas répondu au moins 1 question ou si elle récupérera les utilisateurs qui n'a répondu à aucune question du tout ..

Questions connexes