2011-12-21 12 views
4

Cross post from GitHubタイヤ/ ElasticSearchシングルテーブル継承のサポート

...私は、基本クラス以下のいるおいしい、Twitterのようなさまざまなサードパーティのサービス内のリンクのための私のアプリの検索:

class Link 
    include Mongoid::Document 
    include Tire::Model::Search 
    include Tire::Model::Callbacks 

    field :href, type: String 
    field :name, type: String 

    mapping do 
    indexes :href, type: 'string', analyzer: 'url' 
    indexes :name, type: 'string', analyzer: 'keyword', boost: 10 
    end 
end 

と以下のクラスから継承しますLinkさらに2つのフィールドを追加します。

class Link::Delicious < Link 
    field :tags, type: Array 
    field :time, type: Time 

    mapping do 
    indexes :tags, type: 'string', analyzer: 'keyword' 
    indexes :time, type: 'date' 
    end 
end 

検索は、基本クラスを介して行われます:Link.search('google.com')。これを稼働させる機会はありますか?現時点では、Link::Deliciousの(追加の)フィールドは、Tire/ElasticSearchによって完全に無視されます。そのようmappingメソッドを上書きすることで固定

答えて

4

class Link 
    # … 

    class << self 
    def mapping_with_super(*args, &block) 
     # Creating only one index 
     index_name('links') 
     document_type('link') 

     superclass.mapping_without_super.each do |name, options| 
     indexes(name, options) 
     end if superclass.respond_to?(:mapping) 

     mapping_without_super(args, &block) 
    end 
    alias_method_chain :mapping, :super 
    end 
end