Nick さん、驚いたことに、高度な Searchlogic 手法に関する情報を見つけるのは非常に困難です。サニタイゼーションは、私が対処するのが特に困難でした。
これは、問題に対処するための非常に気の利いた(そして迅速な)方法です。
コントローラ
同じままです
ビュー/ベースライン/index.html.erb
<% form_for @search do |f| %>
<%= f.text_field :keywords %>
<%= submit_tag 'Search' %>
<% end %>
models/baseline.rb
class Baseline < ActiveRecord::Base
scope_procedure :keywords, lambda { |query|
baseline_name_like_or_description_like(query.strip)
}
end
エクストラ
Searchlogic で学んだその他の素晴らしいことを共有できることを楽しみにしています。ここで共有します。
keywords
まず、ごくわずかな作業で、そのscope_procedure を最小限の労力でパワーアップできます。
scope_procedure :keywords, lambda { |query|
baseline_name_like_any_or_description_like_any(query.strip.split(/\s+/))
}
any
各 named_scope への演算子の追加に注意してください
これにより、「foo bar」などの検索を入力できるようになり、「i can foo haz bar」や「bar time, foo!」などのベースライン名と一致します。名前が「foo」で説明が「bar」の場合、これはベースラインにも一致します。つまり、Searchlogic フォームでscope_procedure
定義済みの代わりに使用すると、追加のコントロールが大量に得られます。named_scope
2 つ目は、検索フォームを少し追加するだけでサニタイズできることです。これを理解するのにかなりの時間がかかりましたが、Searchlogic::Search クラスのサブクラスを作成することにしました。見てみな:
models/baseline_search.rb
class BaselineSearch < Searchlogic::Search
def initialize(params, klass, current_scope)
allowed_params = [:keywords, :name_like_any, :foo_equals, :order]
conditions = {}
for x in allowed_params
conditions[x] = params[x] unless params[x].blank?
end
super(klass, current_scope, conditions)
end
end
initialize
メソッド シグネチャがどこにあるのか知りたい場合は、 Searchlogic::Searchを確認してください。
ここで、モデルで Searchlogic::Search を呼び出す代わりに、baseline.rb で単純なオーバーライドを作成する必要があります。ここでは、独自のSearchlogic::Search::Implementationを実装します。
models/baseline.rb
class Baseline < ActiveRecord::Base
# cool scope procedures
# ...
def self.search(params={})
BaselineSearch.new(params || {}, self, scope(:find))
end
end
これで、 を呼び出すと、デフォルトの Searchlogic::Search の代わりにBaseline.search(params[:search])
new が呼び出されます。BaselineSearch
ここですばらしいのは、 の使用をスキップしたい場合は、代わりに Searchlogic のデフォルトを使用するようにBaselineSearch
呼び出すことができることです。Baseline.searchlogic(params[:search])