令人惊讶的是,尼克很难找到有关高级 Searchlogic 技术的信息。消毒对我来说特别困难。
这是处理您的问题的一种非常漂亮(且快速)的方法。
控制器
保持不变
意见/基线/index.html.erb
<% form_for @search do |f| %>
<%= f.text_field :keywords %>
<%= submit_tag 'Search' %>
<% end %>
模型/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!”之类的baseline_names。如果名称是“foo”并且描述是“bar”,这甚至会匹配基线;重点是,如果您使用而不是Searchlogic 表单scope_procedure
中的预定义,您将获得大量额外控制。named_scope
其次,您可以通过一些额外的努力来清理您的搜索表单。这个花了很长时间才弄清楚,但我决定创建 Searchlogic::Search 类的子类。看看这个:
模型/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
现在,您需要在baseline.rb 中创建一个简单的覆盖,而不是在您的模型上调用Searchlogic::Search。在这里,我们将实现自己的Searchlogic::Search::Implementation
模型/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])
,它将调用 newBaselineSearch
而不是 Searchlogic::Search 默认值。这里很酷的是,如果你想跳过使用你的BaselineSearch
,你可以调用Baseline.searchlogic(params[:search])
来使用 Searchlogic 默认值。