在Rails中干燥搜索逻辑

时间:2010-06-06 08:11:51

标签: ruby-on-rails

我正在使用search logic来过滤公司列表页面上的结果。用户可以使用各种命名URL指定任意数量的参数。例如:

  

/位置/的墨西哥
  /扇区/的技术
  /扇区/的金融 /位置/的阿根廷

分别得到以下结果:

params[:location] == 'mexico'
params[:sector] == 'technology'
params[:sector] == 'financial' and params[:location] == 'argentina'

我现在正在尝试清理或“干掉”我的模型代码。目前我有:

def self.search(params)
    ...
    if params[:location]
        results = results.location_permalink_equals params[:location] if results
        results = Company.location_permalink_equals params[:location] unless results
    end
    if params[:sector]
        results = results.location_permalink_equals params[:sector] if results
        results = Company.location_permalink_equals params[:sector] unless results
    end
    ...
end

我不喜欢重复搜索。有什么建议?感谢。


2 个答案:

答案 0 :(得分:1)

这就是我写它的方式:

[params[:location], params[:sector]].reject(&:nil?).each do |q|
  results = (results ? results : Company).location_permalink_equals q
end

还有很多其他方式,只是一个想法。有一个好处是可以轻松添加说params[:street]或其他内容。

答案 1 :(得分:1)

我认为在坚持使用SearchLogic时你不能真的干掉那么多...我建议你改进你的路由直接发出*_permalink作为参数名称并做这样的事情:

Company.all :conditions => params.slice(:location_permalink, :sector_permalink)

Company.find :all, :conditions => params.slice(:location_permalink, :sector_permalink)

文档链接:http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Slice.html