Skip to content

Instantly share code, notes, and snippets.

@stephencelis
Created January 10, 2010 16:18
Show Gist options
  • Save stephencelis/273587 to your computer and use it in GitHub Desktop.
Save stephencelis/273587 to your computer and use it in GitHub Desktop.
More "proper" than a miniskirt (http://gist.github.com/273579).
# More "proper" than a miniskirt (http://gist.github.com/273579).
class Minidress
@@factories = {}
class << self
def define(name, &block)
@@factories[name.to_s] = block
end
def build(name, attrs = {})
new(name.to_s.classify.constantize.new, &@@factories[name.to_s]).record
end
def attributes_for(name, attrs = {})
build(name, attrs).attributes
end
def create(name, attrs = {})
build(name, attrs).tap { |record| record.save }
end
end
attr_reader :record
def initialize(record)
@record = record and yield self
end
def association(name)
send name, self.class.create(name)
end
def sequence(name)
send name, yield(@n ||= record.class.maximum(:id).to_i + 1, record)
end
private
def method_missing(name, *value)
record.send "#{name}=", *(block_given? ? yield(record) : value)
end
end
def Minidress(name, attrs = {})
Minidress.create(name, attrs)
end
Factory = Minidress
alias Factory Minidress
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment