Skip to content

Instantly share code, notes, and snippets.

@marktriggs
Created November 15, 2016 20:55
Show Gist options
  • Select an option

  • Save marktriggs/f4b25ac33426ea589d01185c79c471e0 to your computer and use it in GitHub Desktop.

Select an option

Save marktriggs/f4b25ac33426ea589d01185c79c471e0 to your computer and use it in GitHub Desktop.
module AutoGenerator
def self.included(base)
base.extend(ClassMethods)
end
def update_from_json(json, opts = {}, apply_nested_records = true)
self.class.properties_to_auto_generate.each do |generate_opts|
next if generate_opts[:only_if] and not generate_opts[:only_if].call(json)
if generate_opts[:only_on_create]
# force the value back to the original value from the DB
unless generate_opts[:property] == :ref_id
json[generate_opts[:property]] = self.send(generate_opts[:property])
end
else
next if generate_opts[:only_if_nil] and not json[generate_opts[:property]].nil?
# generate a new value
json[generate_opts[:property]] = generate_opts[:generator].call(json)
mark_as_system_modified
end
end
super
end
module ClassMethods
def create_from_json(json, opts = {})
modified = false
properties_to_auto_generate.each do |generate_opts|
if (generate_opts[:only_if] and generate_opts[:only_if].call(json)) or json[generate_opts[:property]].nil?
json[generate_opts[:property]] = generate_opts[:generator].call(json)
modified = true
end
end
obj = super
obj.mark_as_system_modified if modified
obj
end
def auto_generate(opts)
properties_to_auto_generate.delete_if{|generate_opts| generate_opts[:property] == opts[:property] }
properties_to_auto_generate.push(opts)
end
def properties_to_auto_generate
@properties_to_auto_generate ||= []
@properties_to_auto_generate
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment