aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--activerecord/CHANGELOG.md6
-rw-r--r--activerecord/lib/active_record/store.rb12
-rw-r--r--activerecord/test/cases/store_test.rb6
3 files changed, 23 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index cc18981e93..633198c4bb 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -1,5 +1,11 @@
## Rails 4.0.0 (unreleased) ##
+* Added a `stored_attributes` hash which contains the attributes stored
+ using ActiveRecord::Store. This allows you to retrieve the list of
+ attributes you've defined.
+
+ *Joost Baaij*
+
* `composed_of` was removed. You'll have to write your own accessor
and mutator methods if you'd like to use value objects to represent some
portion of your models. So, instead of:
diff --git a/activerecord/lib/active_record/store.rb b/activerecord/lib/active_record/store.rb
index 542cb3187a..f5c7a9f034 100644
--- a/activerecord/lib/active_record/store.rb
+++ b/activerecord/lib/active_record/store.rb
@@ -1,3 +1,4 @@
+require 'active_support/concern'
require 'active_support/core_ext/hash/indifferent_access'
module ActiveRecord
@@ -33,9 +34,18 @@ module ActiveRecord
# class SuperUser < User
# store_accessor :settings, :privileges, :servants
# end
+ #
+ # The stored attribute names can be retrieved using +stored_attributes+.
+ #
+ # User.stored_attributes[:settings] # [:color, :homepage]
module Store
extend ActiveSupport::Concern
+ included do
+ config_attribute :stored_attributes
+ self.stored_attributes = {}
+ end
+
module ClassMethods
def store(store_attribute, options = {})
serialize store_attribute, IndifferentCoder.new(options[:coder])
@@ -55,6 +65,8 @@ module ActiveRecord
send(store_attribute)[key]
end
end
+
+ self.stored_attributes[store_attribute] = keys.flatten
end
end
diff --git a/activerecord/test/cases/store_test.rb b/activerecord/test/cases/store_test.rb
index 79476ed2a4..e401dd4b12 100644
--- a/activerecord/test/cases/store_test.rb
+++ b/activerecord/test/cases/store_test.rb
@@ -13,7 +13,7 @@ class StoreTest < ActiveRecord::TestCase
assert_equal 'black', @john.color
assert_nil @john.homepage
end
-
+
test "writing store attributes through accessors" do
@john.color = 'red'
@john.homepage = '37signals.com'
@@ -111,4 +111,8 @@ class StoreTest < ActiveRecord::TestCase
@john.is_a_good_guy = false
assert_equal false, @john.is_a_good_guy
end
+
+ test "stored attributes are returned" do
+ assert_equal [:color, :homepage], Admin::User.stored_attributes[:settings]
+ end
end