aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib
diff options
context:
space:
mode:
authorRafael Mendonça França <rafaelmfranca@gmail.com>2012-05-13 15:02:31 -0700
committerRafael Mendonça França <rafaelmfranca@gmail.com>2012-05-13 15:02:31 -0700
commitf443e119cd448b78bcb1584d7a9bd8b5775b5577 (patch)
tree417f2008e72dd69dc20dd34b51b7414d4cb80138 /activerecord/lib
parentd3c83a4e8ef02560cdc5d1e22938c4fa1919355b (diff)
parent3c0bf0435cfbc7a349faec5e1b5631e506b5dc70 (diff)
downloadrails-f443e119cd448b78bcb1584d7a9bd8b5775b5577.tar.gz
rails-f443e119cd448b78bcb1584d7a9bd8b5775b5577.tar.bz2
rails-f443e119cd448b78bcb1584d7a9bd8b5775b5577.zip
Merge pull request #5807 from Antiarchitect/store-improvement
Custom coders support for ActiveRecord::Store.
Diffstat (limited to 'activerecord/lib')
-rw-r--r--activerecord/lib/active_record/store.rb15
1 files changed, 10 insertions, 5 deletions
diff --git a/activerecord/lib/active_record/store.rb b/activerecord/lib/active_record/store.rb
index 1c7b839e5e..a67d6a2288 100644
--- a/activerecord/lib/active_record/store.rb
+++ b/activerecord/lib/active_record/store.rb
@@ -10,15 +10,20 @@ module ActiveRecord
# Make sure that you declare the database column used for the serialized store as a text, so there's
# plenty of room.
#
+ # You can set custom coder to encode/decode your serialized attributes to/from different formats.
+ # JSON, YAML, Marshal are supported out of the box. Generally it can be any wrapper that provides +load+ and +dump+.
+ #
# Examples:
#
# class User < ActiveRecord::Base
- # store :settings, accessors: [ :color, :homepage ]
+ # store :settings, accessors: [ :color, :homepage ], coder: JSON
# end
#
# u = User.new(color: 'black', homepage: '37signals.com')
# u.color # Accessor stored attribute
- # u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor
+ # u.settings['country'] = 'Denmark' # Any attribute, even if not specified with an accessor
+ # String keys should be used for direct access to virtual attributes because of most of the coders do not
+ # distinguish symbols and strings as keys.
#
# # Add additional accessors to an existing store through store_accessor
# class SuperUser < User
@@ -29,7 +34,7 @@ module ActiveRecord
module ClassMethods
def store(store_attribute, options = {})
- serialize store_attribute, Hash
+ serialize store_attribute, options.fetch(:coder, Hash)
store_accessor(store_attribute, options[:accessors]) if options.has_key? :accessors
end
@@ -37,13 +42,13 @@ module ActiveRecord
keys.flatten.each do |key|
define_method("#{key}=") do |value|
send("#{store_attribute}=", {}) unless send(store_attribute).is_a?(Hash)
- send(store_attribute)[key] = value
+ send(store_attribute)[key.to_s] = value
send("#{store_attribute}_will_change!")
end
define_method(key) do
send("#{store_attribute}=", {}) unless send(store_attribute).is_a?(Hash)
- send(store_attribute)[key]
+ send(store_attribute)[key.to_s]
end
end
end