2017-10-18 7 views
0

私のレールモデルには2つのメソッドがあります。同様のARクエリでクエリオブジェクトを実装する正しい方法

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 

我々は、上記の方法から見ることができた場合は、両方ほぼ同様のクエリを行う唯一の違いは、追加の参加条件はmarksテーブルに存在しquestions_mastered_forです。

この特定のユースケースは、通常、クエリオブジェクトを使用して解決できる記事がありますが、正しく実装する方法がわかりますか?

ご迷惑をおかけして申し訳ありません。

答えて

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 
関連する問題