class SearchService < ApplicationService include ElasticsearchAble attr_reader :params def initialize(params) @params = params end def call # return [] if keyword.blank? modal_name.search(keyword, search_options) end private def modal_name @_modal_name ||= case params[:type].to_s.strip when 'shixun' then Shixun when 'course' then Course when 'subject' then Subject when 'memo' then Memo else Shixun end end def search_options model_options = { includes: modal_name.searchable_includes } model_options.deep_merge!(extra_options) model_options.deep_merge!(default_options) model_options end def extra_options case params[:type].to_s.strip when 'shixun' then { where: { id: Laboratory.current.shixuns.where(public: 2, status: 2, fork_from: nil).or(Laboratory.current.shixuns.where(status: 2, id: User.current.shixuns)).pluck(:id) } } when 'subject' then { where: { id: Laboratory.current.subjects.where(public: 2, status: 2) .or( Laboratory.current.subjects.where(status: 2, id: User.current.subjects)).pluck(:id) } } when 'course' then { where: { id: Laboratory.current.all_courses.pluck(:id) } } else {} end end end