Skip to content

Instantly share code, notes, and snippets.

@mrgenixus
Last active May 24, 2017 21:14
Show Gist options
  • Select an option

  • Save mrgenixus/8abc0c18ca59bf12f9fe8a97b8ad6b9e to your computer and use it in GitHub Desktop.

Select an option

Save mrgenixus/8abc0c18ca59bf12f9fe8a97b8ad6b9e to your computer and use it in GitHub Desktop.
Chainable Options
class IndexService
class IndexServiceOptions
def date_range start_date, end_date
new @host, @values.merge(date_range: [start_date, end_date])
end
def hide_removed hide_removed=true
new @host, @values.merge hide_removed: hide_removed
end
def merge_items merge_items=true
new @host, @values.merge merge_items: merge_items
end
def initialize host, values={}
@host = host
@values = values.slice(:date_range, :hide_removed, :merge_items)
end
def perform shopping_list_id, options={}
@host.perform(shopping_list_id, @values.merge(options))
end
def new shopping_list_id, options={}
@host.new(shopping_list_id, @values.merge(options))
end
def method_missing method, *args, &block
if @host.respond_to? method
return @host.send(method, *args, &block)
else
super
end
end
end
def self.options options={}
IndexServiceOptions.new(self, options)
end
class << self
delegate :date_range, :hide_removed, :merge_items, to: 'options'
end
end
# EX: IndexService.date_range(start_date, end_date).hide_removed.perform(shopping_list.id, {})
configured_index_service = IndexService.date_range(start_date, end_date).hide_removed(params[:hide_removed])
configured_index_service.perform(shopping_list.id, staples_list: true)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment