Skip to content

Instantly share code, notes, and snippets.

@nicooga
Last active March 10, 2017 02:24
Show Gist options
  • Save nicooga/bce85207baedbebc9d9586a588f9a2ce to your computer and use it in GitHub Desktop.
Save nicooga/bce85207baedbebc9d9586a588f9a2ce to your computer and use it in GitHub Desktop.
module Search
def run(query, params)
filters.inject(query) do |memo, filter|
filter.call(memo, params)
end
end
def filter(arg, options = {})
case arg
when Symbol
def_simple_filter(arg, options)
when Hash
def_complex_filter(arg, options)
end
end
private
def filters
@filters ||= []
end
def def_simple_filter(attr, options = {})
filters.push(-> (query, params) do
params.key?(attr) ?
query.where(attr => params[attr]) :
query
end)
end
def def_complex_filter(hash, options = {})
raise NotImplementedError
end
end
UserSearch.run(User.all, name: 'Pepe', email: 'Lapone@gmail.com')
module User::Search
extend ::Search
filter :name
filter :email, operation: :matches
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment