На мой взгляд, лучший способ определить и использовать значения по умолчанию - добавить еще одну строку в таблицу пользовательских настроек и загрузить ее в качестве переменной класса в вашей модели. Затем переопределите методы доступа, чтобы найти значения по умолчанию, если предпочтение не найдено. Примерно так:
class UserPreference < ActiveRecord::Base
# load default preferences as a class variable
@@defaults ||= find(1).attributes
# redefine accessors or each column to load default if nil
column_names.each do |column|
method_name = "#{column}_with_default".to_sym
send :define_method, method_name do
value = send("#{column_without_default}")
case value
when nil
@@defaults[column]
else
value
end
end
alias_method_chain column, :default
end
...
end
По существу настройки по умолчанию (загруженные из строки 1) хранятся в модели как переменная класса. Все методы доступа переопределены и включены в цепочку методов псевдонимов, поэтому значение по умолчанию будет возвращено, если возвращаемое значение равно nil. Я хотел использовать || вместо случая, но это может вызвать проблемы в случае, если пользователь установил логическое предпочтение в false.
Редактировать: N.B. Я не знаю хорошего способа обновить настройки по умолчанию в приложении rails без перезагрузки сервера.