読者です 読者をやめる 読者になる 読者になる

SunspotとActiveAdminを一緒に使う時は気をつけよう

Rails

SolrがバックエンドのRailsで利用できる全文検索ライブラリSunspotだがActiveAdminを使う時は注意。
何かというとActiveAdminにはMetasearchという全文検索ライブラリに依存していて一緒にインストールされるが
拡張の仕方が結構似てて下手すると競合するって話。

ASCIICastとかでもModel.searchを推奨しているようにそのように使うことが多いと思う。
(わざわざModel.solr_searchを使う人いないよなあ)


ActiveAdminで使われているMetasearchもModel.searchというメソッドを実装して拡張してる。


SunspotはModel.searchというメソッドを定義するときに既に定義されていない場合aliasを貼るので
Metasearchと共存しているときはModel.searchはMetasearchの提供するメソッドになる。


こんな
sunspot_rails-1.3.3/lib/sunspot/rails/searchable.rb

117         def self.extended(base) #:nodoc:
118           class <<base
119             alias_method :search, :solr_search unless method_defined? :search
120             alias_method :search_ids, :solr_search_ids unless method_defined? :search_ids
121             alias_method :remove_all_from_index, :solr_remove_all_from_index unless method_defined? :remove_all_from_index
122             alias_method :remove_all_from_index!, :solr_remove_all_from_index! unless method_defined? :remove_all_from_index!
123             alias_method :reindex, :solr_reindex unless method_defined? :reindex
124             alias_method :index, :solr_index unless method_defined? :index
125             alias_method :index_orphans, :solr_index_orphans unless method_defined? :index_orphans
126             alias_method :clean_index_orphans, :solr_clean_index_orphans unless method_defined? :clean_index_orphans
127           end
128         end

Model.searchでSunspotの動作を期待してると動かなくなるところがあるよ!


共存させる時の解決方法はgithubのissueでも話されていたけど解決方法はシンプル
SunspotはModel.solr_searchというメソッドを定義しているのでSunspotを使いたいところではそっちを使おう。