|
- module Searchable::Shixun
- extend ActiveSupport::Concern
-
- included do
- searchkick language: 'chinese', callbacks: :async
-
- scope :search_import, -> { includes(:shixun_info, :challenges, :challenge_tags, :users, user: { user_extension: :school }) }
- end
-
- def searchable_title
- name
- end
-
- def search_data
- {
- name: name,
- description: Util.extract_content(description)[0..Searchable::MAXIMUM_LENGTH],
- status: status,
- myshixuns_count: myshixuns_count,
- created_at: created_at,
- publish_time: publish_time,
- is_wechat_support: is_wechat_support
- }.merge!(searchable_user_data)
- .merge!(searchable_challenge_data)
- end
-
- def searchable_user_data
- {
- author_name: user&.real_name,
- author_school_name: user&.school_name,
- }
- end
-
- def searchable_challenge_data
- challenge_names = Util.map_or_pluck(challenges, :subject)
- .each_with_index.map { |subject, index| "第#{index + 1}关 #{subject}" }
-
- {
- challenge_names: challenge_names.join(' '),
- challenge_tag_names: Util.map_or_pluck(challenge_tags, :name).uniq.join(' ')
- }
- end
-
- def should_index?
- !hidden? && [0, 1, 2].include?(status) # published
- end
-
- def to_searchable_json
- {
- id: id,
- identifier: identifier,
- author_name: user.real_name,
- author_school_name: user.school_name,
- visits_count: visits,
- challenges_count: challenges_count,
- study_count: myshixuns_count,
- star: averge_star,
- level: shixun_level,
- is_jupyter: is_jupyter
- }
- end
-
- module ClassMethods
- def searchable_includes
- [ :shixun_info, user: { user_extension: :school } ]
- end
- end
- end
|