diff --git a/lib/setting_accessors/accessor.rb b/lib/setting_accessors/accessor.rb index 82e382e..5547ab8 100644 --- a/lib/setting_accessors/accessor.rb +++ b/lib/setting_accessors/accessor.rb @@ -1,7 +1,6 @@ # # Helper class to make accessing record specific settings easier # - class SettingAccessors::Accessor def initialize(record) @@ -10,10 +9,24 @@ def initialize(record) end # - # Gets a setting's value + # Tries to retrieve the given setting's value from the temp settings + # (already read/written values in this instance). If the setting hasn't been + # used before, its value is retrieved from the database. + # + # If a setting hasn't been read by this record (instance) before, its value + # is stored in the local read set. + # + # TODO: See if this causes problems with read settings not being updated by external changes. + # User1: Read Setting X + # User2: Update Setting X + # User1: Read Setting X -> Gets old value from temp settings. + # This shouldn't be too dangerous as the system state will be refreshed with every request though. # def [](key) - has_key?(key) ? @temp_settings[key.to_sym] : SettingAccessors.setting_class.get(key, @record) + return @temp_settings[key.to_sym] if has_key?(key) + value = SettingAccessors.setting_class.get(key, @record) + @temp_settings[key.to_sym] = value unless value.nil? + value end # diff --git a/lib/setting_accessors/version.rb b/lib/setting_accessors/version.rb index 045da90..c8a9f32 100644 --- a/lib/setting_accessors/version.rb +++ b/lib/setting_accessors/version.rb @@ -1,3 +1,3 @@ module SettingAccessors - VERSION = '0.0.10' + VERSION = '0.0.11' end diff --git a/test/dummy/test/models/user_test.rb b/test/dummy/test/models/user_test.rb index 7c8bae6..7494c5a 100644 --- a/test/dummy/test/models/user_test.rb +++ b/test/dummy/test/models/user_test.rb @@ -43,25 +43,54 @@ class UserTest < ActiveSupport::TestCase @user = User.create end - should 'be updated in database if their whole value changes' do - @user.polymorphic_setting = {:a => :b} - assert @user.save - assert_equal User.last, @user - assert_equal User.last.polymorphic_setting, {:a => :b} - end + context 'when being assigned an initial value' do + should 'be created in database' do + @user.polymorphic_setting = {:a => :b} + assert @user.save + assert_equal User.last, @user + assert_equal User.last.polymorphic_setting, {:a => :b} + end - should 'be updated in database if a property of their value changes' do - @user.polymorphic_setting[:new_key] = 'new_value' - assert @user.save - assert_equal User.last, @user - assert_equal User.last.polymorphic_setting, {:new_key => 'new_value'} + should 'be created in database if one of their properties changes' do + @user.polymorphic_setting[:new_key] = 'new_value' + assert @user.save + assert_equal User.last, @user + assert_equal({:new_key => 'new_value'}, User.last.polymorphic_setting) + end + + should 'not change the value of other assignable settings' do + @user2 = User.create + @user2.polymorphic_setting = {:foo => :bar} + assert @user2.save + assert_equal User.first.polymorphic_setting, {} + end end - should 'not update other assignable settings' do - @user2 = User.create - @user2.polymorphic_setting = {:foo => :bar} - assert @user2.save - assert_equal User.first.polymorphic_setting, {} + context 'when being updated' do + setup do + @user.polymorphic_setting = {:a => :b} + assert @user.save + assert @user.reload + assert_equal({:a => :b}, @user.polymorphic_setting) + assert_equal({:a => :b}, User.last.polymorphic_setting) + end + + # Single hash value changed, etc. + should 'be saved if one of their properties changes' do + @user.polymorphic_setting[:a] = :c + assert @user.save + assert @user.reload + assert_equal({:a => :c}, @user.polymorphic_setting) + assert_equal({:a => :c}, User.last.polymorphic_setting) + end + + should 'be updated if their whole value changes' do + @user.polymorphic_setting = {:a => :c} + assert @user.save + assert @user.reload + assert_equal({:a => :c}, @user.polymorphic_setting) + assert_equal({:a => :c}, User.last.polymorphic_setting) + end end end end