开发者

DRYing Search Logic in Rails

开发者 https://www.devze.com 2023-01-02 16:35 出处:网络
I am using search logic to filter results on company listing page. The user is able to specif开发者_开发问答y any number of parameters using a variety of named URLs. For example:

I am using search logic to filter results on company listing page. The user is able to specif开发者_开发问答y any number of parameters using a variety of named URLs. For example:

/location/mexico

/sector/technology

/sector/financial/location/argentina

Results in the following respectively:

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

I am now trying to cleanup or 'DRY' my model code. Currently I have:

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

I don't like repeating the searchs. Any suggestions? Thanks.



This is how I would write it:

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

There's plenty of other ways, just an idea. Has the benefit of making it easy to add say params[:street] or something.


I don't think you can really DRY that up much when sticking to SearchLogic... I'd suggest to refine your routes to directly emit *_permalink as parameter names and do something like this:

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

or

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

Documentation link: http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Slice.html

0

精彩评论

暂无评论...
验证码 换一张
取 消