Skip to content

Instantly share code, notes, and snippets.

@dpaluy
Created June 17, 2023 23:27
Show Gist options
  • Save dpaluy/4c8f60d525fa22a237221722c2d662f7 to your computer and use it in GitHub Desktop.
Save dpaluy/4c8f60d525fa22a237221722c2d662f7 to your computer and use it in GitHub Desktop.
module Resettable
extend ActiveSupport: :Concern
included do
attribute_method_affix prefix: 'reset_', suffix: '_to_default!'
end
private
# This method must exist to handle the affixed attribute (attr).
def reset_attribute_to_default!(attr)
send("#{attr}=", defaults[attr])
save!
end
def defaults
self.class.column_defaults # default values defined in migration
end
end
class Setting < ApplicationRecord
include Resettable
end
Setting.column_defaults # => { 'theme _preference' => :light_mode, ... }
setting = Setting.create(theme_preference: :dark_mode)
setting.theme_preference #=> :dark_mode
setting.reset_theme_preference_to_default!
setting.theme_preference #=> :light_mode
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment