55 lines
No EOL
1.7 KiB
Ruby
55 lines
No EOL
1.7 KiB
Ruby
class MigrateUserSettings < ActiveRecord::Migration[4.2]
|
|
def up
|
|
say_with_time 'Save old user settings in new RailsSettings module' do
|
|
|
|
# Allow setting default locale via env parameter
|
|
# This is used, when setting users language settings
|
|
default_locale = I18n.default_locale
|
|
tmp_locale = ENV['DEFAULT_LOCALE'].present? ? ENV['DEFAULT_LOCALE'].to_sym : default_locale
|
|
I18n.default_locale = tmp_locale
|
|
|
|
old_settings = ConfigurableSetting.all
|
|
|
|
old_settings.each do |old_setting|
|
|
# get target (user)
|
|
type = old_setting.configurable_type
|
|
id = old_setting.configurable_id
|
|
begin
|
|
user = type.constantize.find(id)
|
|
rescue ActiveRecord::RecordNotFound
|
|
Rails.logger.debug "Can't find configurable object with type: #{type.inspect}, id: #{id.inspect}"
|
|
next
|
|
end
|
|
|
|
# get the data (settings)
|
|
name = old_setting.name
|
|
namespace = name.split('.')[0]
|
|
key = name.split('.')[1].underscore # Camelcase to underscore
|
|
|
|
# prepare value
|
|
value = YAML.load(old_setting.value)
|
|
value = value.nil? ? false : value
|
|
|
|
# set the settings_attributes (thanks to settings.merge! we can set them one by one)
|
|
user.settings_attributes = {
|
|
"#{namespace}" => {
|
|
"#{key}" => value
|
|
}
|
|
}
|
|
|
|
# save the user to apply after_save callback
|
|
user.save
|
|
end
|
|
|
|
I18n.default_locale = default_locale
|
|
end
|
|
|
|
drop_table :configurable_settings
|
|
end
|
|
|
|
def down
|
|
end
|
|
end
|
|
|
|
# this is the base class of all configurable settings
|
|
class ConfigurableSetting < ActiveRecord::Base; end |