1

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
4

0 に答える 0