Skip to content

Instantly share code, notes, and snippets.

@elskwid
Created February 23, 2013 20:35
Show Gist options
  • Save elskwid/5021244 to your computer and use it in GitHub Desktop.
Save elskwid/5021244 to your computer and use it in GitHub Desktop.
Enumerator fun
require "active_support/all"
class Event
STATES = %w(active archived)
def self.types(&block)
return to_enum(__callee__) unless block
types = {
entity_address: [
"verified_for_billing",
"verified_for_care",
"verified_for_records",
"verified_for_serve"
],
order: [
"case_number_empty",
"case_number_set"
]
}
types.each do |k, v|
v.each do |t|
yield k,t
end
end
end
def self.types_for(model)
model = model.to_s.underscore.to_sym
types.select { |k, t| k == model }
end
types.each do |model, type|
define_singleton_method "#{model}_#{type}" do
puts "events.event_type = ?", "#{model}.#{type}"
end
end
attr_accessor :item_type
def initialize(type=nil)
@item_type = type
end
# Validation options for event type based on item type.
def event_type_options
event_types = self.class.types_for(item_type)
event_types.map { |model, type| "#{model}.#{type}" }
end
end
e = Event.new
puts e.event_type_options.inspect
# => []
e1 = Event.new("EntityAddress")
puts e1.event_type_options.inspect
# => ["entity_address.verified_for_billing", "entity_address.verified_for_care", "entity_address.verified_for_records", "entity_address.verified_for_serve"]
Event.entity_address_verified_for_billing
# => events.event_type = ?
# => entity_address.verified_for_billing
Event.order_case_number_empty
# => events.event_type = ?
# => order.case_number_empty
@kjohnston
Copy link

I like what you've done with self.types, certainly addresses the smell I had in my event_type_options.

@kjohnston
Copy link

Also, take a look at the Issue model in that project. It's a related example that used arrays to define the types and had a slightly cleaner options method than the Event model called for.

@elskwid
Copy link
Author

elskwid commented Feb 23, 2013

Will do.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment