diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2007-09-20 23:22:30 +0000 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2007-09-20 23:22:30 +0000 |
commit | e86d1cd621ca62af6f71b04032b1e07a66c06bb6 (patch) | |
tree | 638a89da26f9066cc333f0ce059c3ce551a97d24 /activerecord/lib/active_record/serialization.rb | |
parent | dc399b96c84bc66b7c20e92fb40e9ed00daf99c2 (diff) | |
download | rails-e86d1cd621ca62af6f71b04032b1e07a66c06bb6.tar.gz rails-e86d1cd621ca62af6f71b04032b1e07a66c06bb6.tar.bz2 rails-e86d1cd621ca62af6f71b04032b1e07a66c06bb6.zip |
Added ActiveRecord::Base#to_json/from_json (currently does not support :include like to_xml) [DHH]. Added ActiveRecord::Base#from_xml [DHH]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@7519 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activerecord/lib/active_record/serialization.rb')
-rw-r--r-- | activerecord/lib/active_record/serialization.rb | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/serialization.rb b/activerecord/lib/active_record/serialization.rb new file mode 100644 index 0000000000..f10d1b3b7e --- /dev/null +++ b/activerecord/lib/active_record/serialization.rb @@ -0,0 +1,59 @@ +module ActiveRecord #:nodoc: + module Serialization + class Serializer #:nodoc: + attr_reader :options + + def initialize(record, options = {}) + @record, @options = record, options.dup + end + + # To replicate the behavior in ActiveRecord#attributes, + # :except takes precedence over :only. If :only is not set + # for a N level model but is set for the N+1 level models, + # then because :except is set to a default value, the second + # level model can have both :except and :only set. So if + # :only is set, always delete :except. + def serializable_attribute_names + attribute_names = @record.attribute_names + + if options[:only] + options.delete(:except) + attribute_names = attribute_names & Array(options[:only]).collect { |n| n.to_s } + else + options[:except] = Array(options[:except]) | Array(@record.class.inheritance_column) + attribute_names = attribute_names - options[:except].collect { |n| n.to_s } + end + + attribute_names + end + + def serializable_method_names + Array(options[:methods]).inject([]) do |method_attributes, name| + method_attributes << :name if @record.respond_to?(name.to_s) + method_attributes + end + end + + def serializable_names + serializable_attribute_names + serializable_method_names + end + + def serializable_record + returning(serializable_record = {}) do + serializable_names.each { |name| serializable_record[name] = @record.send(name) } + end + end + + def serialize + # overwrite to implement + end + + def to_s(&block) + serialize(&block) + end + end + end +end + +require 'active_record/serializers/xml_serializer' +require 'active_record/serializers/json_serializer'
\ No newline at end of file |