1

検索したい非常に複雑なモデル階層があります。基本的に、私には履歴書を持っている人がいて、それには多くのことがあり、フリーテキスト検索に一致する人を返したいです (「軍隊」は、「超素晴らしい部門」を検索して、軍隊にいた人々を呼び起こします)その部門などにいる人を返します。

これは私がこれまでに持っているものの例です(完全ではありません)

class Person < ActiveRecord::Base
  has_many :certifications, :as => :certificationable, :dependent => :destroy
  has_many :educations, :as => :educationable, :dependent => :destroy
  has_many :phones, :as => :phoneable, :dependent => :destroy
  has_many :emails, :as => :emailable, :dependent => :destroy
  has_one :resume, :dependent => :destroy
  belongs_to :division
  belongs_to :employment_status
  belongs_to :user

  mapping do

    indexes :id,      index: :not_analyzed
    indexes :first,   analyzer: 'keyword'
    indexes :middle,  analyzer: 'keyword'
    indexes :last,    analyzer: 'keyword'
    indexes :sector
    indexes :job_title
    indexes :div_title
    indexes :loc
    indexes :department
    indexes :unit
    indexes :unit_name, analyzer: 'snowball'

    indexes :division, :analyzer => 'snowball', :class => [Division], :type => :nested

    indexes :employment_status
    indexes :emails do
      indexes :address 
    end

    indexes :phones do
      indexes :number
    end

    indexes :resume do
      indexes :military_services do
        indexes :military_rank do
          indexes :title
          indexes :abbreviation
        end
      end
    end
  end

  def to_indexed_json
    to_json(
        except: [:avatar],
        include: {
          division: {
            only: [:name, :abbrev, :id]
          },

          emails: {
            only: [:address]
          },

          phones: {
            only: [:number]
          },

          resume: {
           include: {
             military_services: {
               exclude: [:updated_at, :created_at],
               include: {
                 military_rank: {
                   only: [:title, :abbreviation]
                 }
               }
             }
           }
          }
        }
    )
  end

  def self.search(params, options = {})
    tire.search(options) do
      query do
        boolean do
          must { string params[:query] } if params[:query].present?
          must { term :division_id, params[:division_id] } if params[:division_id].present?
        end
      end

      sort { by :first, 'asc' }

      facet :division do
        terms :division_id
      end
    end
  end

終わり

これは機能しているように見えますが、インデックス作成と json の両方について、これらのモデルのいくつかにかなり深く到達する必要があるため、扱いにくいものです。これは私の目標を達成するための最良の方法ですか? すべてのモデルとそれらの関係をインデックス化してマッピングし、それらを Person に関連付ける方法が必要だと常に感じています。

かなり扱いにくいので、jsonにも苦労しています。人々はこれに jbuilder または active_model_serializers を使用しますか?

4

0 に答える 0