0

アプリで全文検索に ElasticSearch + Tire を使用しようとしています。

Entry現在、ペーパークリップをhas_attached_file介したモデルがあります。ElasticSearch/Tire の最新バージョンをインストールして実行し、Attachment-mapping プラグインもインストールしました。

私のクエリが他のEntryフィールドのいずれかにあるものであれば、問題なく動作します。rake environment tire:import CLASS="Entry"インデックスを更新するために実行しようとしましたが、

** Invoke environment (first_time)
** Execute environment
** Invoke tire:import (first_time)
** Execute tire:import
[IMPORT] Starting import for the 'Entry' class
--------------------------------------------------------------------------------
7/7 | 100% rake aborted!##############################################
stack level too deep
/home/capuser/.rvm/gems/ruby-1.9.2-p320/gems/rake-0.9.2.2/lib/rake/task.rb:162
Tasks: TOP => tire:import

ファイルのエンコードまたは関数のいずれかに問題があると感じていto_indexed_jsonます。

ここにいくつかのコードがあります:

class Entry < ActiveRecord::Base
  include Tire::Model::Search
  include Tire::Model::Callbacks

  has_attached_file :document,
                :url  => "/assets/entries/:id/:basename.:extension",
                :path => ":rails_root/public/assets/entries/:id/:basename.:extension"

  before_post_process :image?

  validates_presence_of :entry_type

  attr_accessible :description, :title, :url, :category_ids, :subcategory_ids, :entry_type_id, :document

  mapping do
    indexes :title
    indexes :description
    indexes :categories do
      indexes :name
    end
    indexes :subcategories do
      indexes :name
    end
    indexes :entry_type
    indexes :document, :type => 'attachment'
  end

 def to_indexed_json  
    {
    :title          => title,
    :description    => description,
    :categories     => categories.map { |c| { :name => c.name}},
    :subcategories  => subcategories.map { |s| { :name => s.name}},
    :entry_type     => entry_type_name,
    :document       => attachment
    }.to_json
  end


  def self.search(params)
    tire.search(load: true) do
      query { string params[:query], default_operator: "AND" } if params[:query].present?
    end
  end

  def attachment
    if document.present?
      path_to_document = "#{RAILS_ROOT}/app/assets/#{document}"
      Base64.encode64(open(path_to_document) { |pdf| pdf.read})
    end
  end
end
4

2 に答える 2

0

いくつかのばかげたタイプミスがありました。それは物事を台無しにしていました。to_indexed_json 関数を別の形式で記述した記事を読んだに違いなく、混乱しました。質問を書く直前に修正したので、これは以前に持っていたものです。

 def to_indexed_json  
    {
    :title          => title,
    :description    => description,
    :categories     => categories.map { |c| { :name => c.name}},
    :subcategories  => subcategories.map { |s| { :name => s.name}},
    :entry_type     => entry_type_name,
    :methods        => [:attachment]
    }.to_json
  end
于 2012-11-06T00:25:21.333 に答える
0

メソッドのハッシュはjsonにあり、メソッドを実際にヒットさせたい場合は、jsonの外にある必要があります。そのようです:

def to_indexed_json  
  only: {
    :title          => title,
    :description    => description,
    :categories     => categories.map { |c| { :name => c.name}},
    :subcategories  => subcategories.map { |s| { :name => s.name}},
    :entry_type     => entry_type_name
  },
  methods: [:attachment]
end
于 2016-04-08T14:23:20.797 に答える