Skip to content

Instantly share code, notes, and snippets.

@TeWu
Created April 30, 2017 12:07
Show Gist options
  • Save TeWu/29e9cf11bec0504e278755ce60786766 to your computer and use it in GitHub Desktop.
Save TeWu/29e9cf11bec0504e278755ce60786766 to your computer and use it in GitHub Desktop.
RolesBitmaskSerializerSupport
module RolesBitmaskSerializerSupport
extend ActiveSupport::Concern
RolesBitmaskSerializer = GamesBox::Serializers::RolesBitmaskSerializer
class_methods do
def serialize_as_roles_bitmask(deserialized_attr, serialized_attr)
deser_setter_name = "#{deserialized_attr}=".to_sym
ser_setter_name = "#{serialized_attr}=".to_sym
get_deser = -> () { self.send(deserialized_attr) }
set_deser = -> (*attrs) { self.send(deser_setter_name, *attrs)
get_ser = -> () { self.send(serialized_attr) }
set_ser = -> (*attrs) { self.send(ser_setter_name, *attrs)
after_initialize { set_deser(RolesBitmaskSerializer.load(get_ser), bypass_sync: true) }
define_method ser_setter_name do |roles_bitmask, **options|
super(roles_bitmask)
set_deser(RolesBitmaskSerializer.load(self.roles_bitmask), bypass_sync: true) unless options[:bypass_sync]
end
attr_accessor deserialized_attr
define_method deser_setter_name do |roles, **options|
super(roles)
set_ser(RolesBitmaskSerializer.dump(self.roles), bypass_sync: true) unless options[:bypass_sync]
end
define_method "add_#{deserialized_attr}" do |role|
set_deser(get_deser + [role])
end
define_method "remove_#{deserialized_attr}" do |role|
set_deser(get_deser - [role])
end
end
end
end
@TeWu
Copy link
Author

TeWu commented Apr 30, 2017

Not tested in ANY way.
Rejected as to complicated and hard to read in favor of less generic code (deserialized_attr fixed as :roles, serialized_attr fixed as :roles_bitmask).

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