2017-10-18 10 views
0

J'ai deux méthodes dans mon modèle d'application rails.La méthode correcte pour implémenter des objets Query pour des requêtes AR similaires

def questions_mastered_for(user_id, question_group_ids) 
    res = UserAnswer 
      .joins('INNER JOIN question_group_questions ON user_answers.question_id = question_group_questions.question_id') 
      .joins('INNER JOIN marks ON user_answers.id = marks.user_answer_id') 
      .group('question_group_questions.question_group_id') 
      .where(question_group_questions: { question_group_id: question_group_ids }) 
      .where(user_answers: { user_id: user_id }) 
      .where("(marks.boolean_mark_correct = true AND marks.mark_type = 'boolean') OR (marks.fraction_numerator = marks.fraction_denominator AND marks.mark_type = 'fraction')") 
      .pluck('question_group_questions.question_group_id', 'COUNT(DISTINCT(user_answers.question_id))') 

    question_group_mastery = {} 
    question_group_ids.each { |question_group_id| question_group_mastery[question_group_id] = 0 } 
    res.each { |data| question_group_mastery[data.first] = data.second } 

    question_group_mastery 
end 

def questions_attempted_for(user_id, question_group_ids) 
    res = UserAnswer 
      .joins('INNER JOIN question_group_questions ON user_answers.question_id = question_group_questions.question_id') 
      .group('question_group_questions.question_group_id') 
      .where(question_group_questions: { question_group_id: question_group_ids }) 
      .where(user_answers: { user_id: user_id }) 
      .pluck('question_group_questions.question_group_id', 'COUNT(DISTINCT(user_answers.question_id))') 

    question_group_attempted = {} 
    question_group_ids.each { |question_group_id| question_group_attempted[question_group_id] = 0 } 
    res.each { |data| question_group_attempted[data.first] = data.second } 

    question_group_attempted 
end 

Si nous pouvons voir des méthodes ci-dessus, les deux ne interrogent presque similaire, la seule différence est dans questions_mastered_for il y a jointure supplémentaire et où la condition à la table marks.

J'ai lu quelques articles que ce cas d'utilisation particulier peut généralement être résolu en utilisant l'objet de requête, mais je me demande comment l'implémenter correctement?

Toutes les suggestions que j'apprécie aimablement.

Répondre

0
def questions_attempted_for_query(user_id, question_group_ids) 
    UserAnswer 
      .joins('INNER JOIN question_group_questions ON user_answers.question_id = question_group_questions.question_id') 
      .group('question_group_questions.question_group_id') 
      .where(question_group_questions: { question_group_id: question_group_ids }) 
      .where(user_answers: { user_id: user_id }) 
end 
def questions_mastered_for(user_id, question_group_ids) 
    res = questions_attempted_for_query(user_id, question_group_ids) 
      .joins('INNER JOIN marks ON user_answers.id = marks.user_answer_id') 
      .where("(marks.boolean_mark_correct = true AND marks.mark_type = 'boolean') OR (marks.fraction_numerator = marks.fraction_denominator AND marks.mark_type = 'fraction')") 
      .pluck('question_group_questions.question_group_id', 'COUNT(DISTINCT(user_answers.question_id))') 

    question_group_mastery = {} 
    question_group_ids.each { |question_group_id| question_group_mastery[question_group_id] = 0 } 
    res.each { |data| question_group_mastery[data.first] = data.second } 

    question_group_mastery 
end 

def questions_attempted_for(user_id, question_group_ids) 
    res = questions_attempted_for_query(user_id, question_group_ids) 
      .pluck('question_group_questions.question_group_id', 'COUNT(DISTINCT(user_answers.question_id))') 

    question_group_attempted = {} 
    question_group_ids.each { |question_group_id| question_group_attempted[question_group_id] = 0 } 
    res.each { |data| question_group_attempted[data.first] = data.second } 

    question_group_attempted 
end