Query DSL Explained Tutorial Slides 14-15を参照してください。
ネストされたオブジェクトをフラット化するにはどうすればよいですか?
という名前のモデルEntry
と別の名前のモデルがありCategory
、それらは HABTM 関連付けを共有しています。現在、すべてが機能しており、検索結果は正しいようですが、マッピングが正しいかどうかはわかりません。チュートリアルによると、オブジェクトをフラット化すると、ドキュメントは次のようになります。
{
tweet => "Perl is GREAT!",
posted => "2011-08-15",
user.name => "Clinton Gormley",
user.email => "drtech@cpan.org",
tags => ["perl","opinion"],
posts => 2,
}
オブジェクトuser
がフラット化されます。JSON ドキュメントのソースを見ると、次のようになります。
{
"title":"First",
"description":"first test",
"categories":
{"categories_name":"CAP and Using the CAP website"},
"attachment":"VEVTVCE=\n",
"published":true
}
だから、私はそれが言うべきcategories.categories_name
だと思っていますが、それを指定する方法や、それが必要かどうかさえわかりません。モデルコードは次のとおりです。
class Entry < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
has_and_belongs_to_many :categories
mount_uploader :doc, EntryDocUploader
tire.mapping do
indexes :title
indexes :description
indexes :categories do
indexes :categories_name, type: 'string', index: 'not_analyzed'
end
indexes :attachment, :type => 'attachment',
:fields => {
:title => { :store => 'yes' },
:attachment => { :term_vector => 'with_positions_offsets', :store => 'yes' }
}
end
def to_indexed_json
{
:title => title,
:description => description,
:categories => {:categories_name => cats}, #categories.map { |c| { :categories_name => c.name}}.to_sentence,
:attachment => attachment,
}.to_json
end
def self.search(params)
tire.search(load: true) do
query { string params[:query], default_operator: "AND" } if params[:query].present?
filter :term, :published => "true"
end
end
def cats
categories.map(&:name).to_sentence
end
end