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