diff options
author | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2012-05-13 15:02:31 -0700 |
---|---|---|
committer | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2012-05-13 15:02:31 -0700 |
commit | f443e119cd448b78bcb1584d7a9bd8b5775b5577 (patch) | |
tree | 417f2008e72dd69dc20dd34b51b7414d4cb80138 /activerecord/lib | |
parent | d3c83a4e8ef02560cdc5d1e22938c4fa1919355b (diff) | |
parent | 3c0bf0435cfbc7a349faec5e1b5631e506b5dc70 (diff) | |
download | rails-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.rb | 15 |
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 |