Ник, на удивление, довольно сложно найти информацию о продвинутых методах Searchlogic.Санитарная обработка была для меня особенно трудной.
Вот довольно изящный (и быстрый) способ справиться с вашей проблемой.
контроллер
остается прежним
views / baselines / 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" и совпадать с baseline_names как "я могу foo haz bar "или" bar time, foo! "Это даже соответствовало бы базовой линии, если бы имя было «foo», а описание было «bar»;в сущности, вы получаете тонны дополнительного контроля, если вы используете scope_procedure
вместо предопределенного named_scope
в формах Searchlogic.
Во-вторых, вы можете санировать свои поисковые формы с небольшими дополнительными усилиями.Чтобы понять это, потребовалось много времени, но я решил создать подкласс класса 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 :: Реализация
models / baseline.rb
class Baseline < ActiveRecord::Base
# cool scope procedures
# ...
def self.search(params={})
BaselineSearch.new(params || {}, self, scope(:find))
end
end
Теперь, когда вы звоните Baseline.search(params[:search])
,он вызовет новый BaselineSearch
вместо значения по умолчанию Searchlogic :: Search.Крутая вещь здесь: если вы хотите пропустить, используя BaselineSearch
, вы можете позвонить Baseline.searchlogic(params[:search])
, чтобы использовать вместо него Searchlogic по умолчанию.