Skip to content

Instantly share code, notes, and snippets.

Created October 10, 2016 09:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/a9528d1fc58daa2b6f9b4be9f77e3ceb to your computer and use it in GitHub Desktop.
Save anonymous/a9528d1fc58daa2b6f9b4be9f77e3ceb to your computer and use it in GitHub Desktop.
module Model
BaseModel = Class.new(Sequel::Model)
class BaseModel
class << self
def initialize_subclass(visible_fields,callable_setters)
@user_visible_fields = visible_fields
@user_callable_setters = []
end
def inherited(sc)
super
sc.send(:initialize_subclass,@user_visible_fields || [],@user_callable_setters || [])
end
def add_user_visible_fields *args
@user_visible_fields += args
end
def add_user_callable_setters *args
@user_callable_setters += args
end
def user_safe_create params
model = new
model.set_user_writeable_fields(params)
model.save
end
end
private_class_method :initialize_subclass
def user_visible_fields
self.class.instance_variable_get(:@user_visible_fields)
end
def user_callable_setters
self.class.instance_variable_get(:@user_callable_setters)
end
def public_fields
keys.select { |k| user_visible_fields.include? k }.map { |k| [k,send(k)] }.to_h
end
def set_user_writeable_fields hash={}
hash.each do |k,v|
if user_callable_setters.include?(k)
meth = "#{k}=".to_sym
if self.respond_to?(meth)
self.send(meth,v)
end
else
puts "user tries to write user_protected field #{k} of #{self.inspect}"
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment