serialize_and_symbolize.rb 1.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. module SerializeAndSymbolize
  2. extend ActiveSupport::Concern
  3. module ClassMethods
  4. def serialize_and_symbolize(*column_names)
  5. column_names.flatten.uniq.compact.map(&:to_sym).each do |column_name|
  6. setup_name = "setup_#{column_name}".to_sym
  7. symbolize_name = "symbolize_#{column_name}".to_sym
  8. validate_name = "validate_#{column_name}".to_sym
  9. serialize column_name
  10. after_initialize setup_name
  11. before_validation symbolize_name
  12. before_save symbolize_name
  13. validate validate_name
  14. class_eval <<-RUBY
  15. def #{setup_name}
  16. self[:#{column_name}] ||= {}
  17. end
  18. def #{validate_name}
  19. # Implement me in your subclass.
  20. end
  21. def #{symbolize_name}
  22. self.#{column_name} = self[:#{column_name}]
  23. end
  24. def #{column_name}=(data)
  25. if data.is_a?(String)
  26. self[:#{column_name}] = JSON.parse(data).recursively_symbolize_keys rescue data
  27. elsif data.is_a?(Hash)
  28. self[:#{column_name}] = data.recursively_symbolize_keys
  29. else
  30. self[:#{column_name}] = data
  31. end
  32. end
  33. RUBY
  34. end
  35. end
  36. end
  37. end