class ShixunSearchService < ApplicationService include ElasticsearchAble attr_reader :params, :laboratory def initialize(params, laboratory) @params = params @laboratory = laboratory end def call # 全部实训/我的实训 type = params[:type] || "all" # 状态:已发布/未发布 status = params[:status] || "all" @shixuns = laboratory.shixuns.none_closed # 超级管理员用户显示所有未隐藏的实训、非管理员显示所有已发布的实训(对本单位公开且未隐藏未关闭) if type == "mine" @shixuns = @shixuns.where(id: User.current.shixuns) else if User.current.admin? || User.current.business? || !User.current.school_id @shixuns = @shixuns.where(hidden: 0) else shixun_ids = ShixunSchool.where(school_id: User.current.school_id).pluck(:shixun_id) shixun_ids = shixun_ids.reject(&:blank?).length == 0 ? -1 : shixun_ids.join(",") @shixuns = @shixuns.where("use_scope = 0 or id in (#{shixun_ids})").unhidden.publiced.or(@shixuns.where(id: User.current.shixuns)) end end unless status == "all" @shixuns = status == "published" ? @shixuns.where(status: 2) : @shixuns.where(status: [0, 1]) end if params[:no_jupyter] @shixuns = @shixuns.where(is_jupyter: 0) end ## 筛选 难度 if params[:diff].present? && params[:diff].to_i != 0 @shixuns = @shixuns.where(trainee: params[:diff]) end Shixun.search(keyword, search_options) end private def search_options order = if sort_str == "wechat_myshixuns_count" {"is_wechat_support" => "desc", "myshixuns_count" => order_str} else {sort_str => order_str} end model_options = { includes: [ :shixun_info, :challenges, :subjects, user: { user_extension: :school } ] } model_options.merge!(where: { id: @shixuns.pluck(:id) }) model_options.merge!(order: order) model_options.merge!(default_options) model_options end def order_str params[:order] || "desc" end def sort_str params[:sort] || "myshixuns_count" end end