class OptionalItemQuery < ApplicationQuery attr_reader :params def initialize(params) @params = params end def call items = ItemBank.all if params[:tag_discipline_id].present? && params[:sub_discipline_id].present? items = items.joins(:tag_discipline_containers).where(tag_discipline_containers: {tag_discipline_id: params[:tag_discipline_id]}) hacks = Hack.joins(:tag_discipline_containers).where(tag_discipline_containers: {tag_discipline_id: params[:tag_discipline_id]}) elsif params[:sub_discipline_id].present? items = items.where(sub_discipline_id: params[:sub_discipline_id]) hacks = Hack.where(sub_discipline_id: params[:sub_discipline_id]) end # 来源 source = params[:source].present? ? params[:source].to_i : 1 public = source == 3 ? [0, 1] : source items = items.where(public: public) # 难度 difficulty = params[:difficulty] ? params[:difficulty].to_i : 1 items = items.where(difficulty: difficulty) single_question_count = items.select{ |item| item.item_type == "SINGLE" }.size multiple_question_count = items.select{ |item| item.item_type == "MULTIPLE" }.size judgement_question_count = items.select{ |item| item.item_type == "JUDGMENT" }.size program_question_count = hacks.present? ? hacks.pluck(:item_bank_id).reject(&:blank?).size : items.select{ |item| item.item_type == "PROGRAM" }.size {single_question_count: single_question_count, multiple_question_count: multiple_question_count, judgement_question_count: judgement_question_count, program_question_count: program_question_count} end end