aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoost Baaij <joost@spacebabies.nl>2012-03-13 16:14:20 +0100
committerCarlos Antonio da Silva <carlosantoniodasilva@gmail.com>2012-06-18 23:49:48 -0300
commit757f7231cccd2bcbfb83fba5cb203fb320f3e613 (patch)
treebd16dbccdaa0d54e2ad579c626c5a3ea5afbd49b
parentdf2104e06784a4b98d8f30cb3ea4eee69304e768 (diff)
downloadrails-757f7231cccd2bcbfb83fba5cb203fb320f3e613.tar.gz
rails-757f7231cccd2bcbfb83fba5cb203fb320f3e613.tar.bz2
rails-757f7231cccd2bcbfb83fba5cb203fb320f3e613.zip
Remember the stored attributes in a config attribute.
This allows you to retrieve the list of attributes you've defined. Usable for e.g. selects in the view, or interators based on the attributes you wish to store in the serialized column.
-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