Module: ActiveRecord::Serialization
- Defined in:
- lib/active_record/serialization.rb,
lib/active_record/serializers/xml_serializer.rb,
lib/active_record/serializers/json_serializer.rb
Defined Under Namespace
Classes: JsonSerializer, Serializer
Instance Method Summary collapse
- #from_json(json) ⇒ Object
- #from_xml(xml) ⇒ Object
-
#to_json(options = {}) ⇒ Object
Returns a JSON string representing the model.
-
#to_xml(options = {}, &block) ⇒ Object
Builds an XML document to represent the model.
Instance Method Details
#from_json(json) ⇒ Object
60 61 62 63 |
# File 'lib/active_record/serializers/json_serializer.rb', line 60 def from_json(json) self.attributes = ActiveSupport::JSON.decode(json) self end |
#from_xml(xml) ⇒ Object
128 129 130 131 |
# File 'lib/active_record/serializers/xml_serializer.rb', line 128 def from_xml(xml) self.attributes = Hash.from_xml(xml).values.first self end |
#to_json(options = {}) ⇒ Object
Returns a JSON string representing the model. Some configuration is
available through options.
Without any options, the returned JSON string will include all
the model's attributes. For example:
konata = User.find(1)
konata.to_json
{"id": 1, "name": "Konata Izumi", "age": 16,
"created_at": "2006/08/01", "awesome": true}
The :only and :except options can be used to limit the attributes included, and work similar to the #attributes method. For example:
konata.to_json(:only => [ :id, :name ])
{"id": 1, "name": "Konata Izumi"}
konata.to_json(:except => [ :id, :created_at, :age ])
{"name": "Konata Izumi", "awesome": true}
To include any methods on the model, use :methods.
konata.to_json(:methods => :permalink)
{"id": 1, "name": "Konata Izumi", "age": 16,
"created_at": "2006/08/01", "awesome": true,
"permalink": "1-konata-izumi"}
To include associations, use :include.
konata.to_json(:include => :posts)
{"id": 1, "name": "Konata Izumi", "age": 16,
"created_at": "2006/08/01", "awesome": true,
"posts": [{"id": 1, "author_id": 1, "title": "Welcome to the weblog"},
{"id": 2, author_id: 1, "title": "So I was thinking"}]}
2nd level and higher order associations work as well:
konata.to_json(:include => { :posts => {
:include => { :comments => {
:only => :body } },
:only => :title } })
{"id": 1, "name": "Konata Izumi", "age": 16,
"created_at": "2006/08/01", "awesome": true,
"posts": [{"comments": [{"body": "1st post!"}, {"body": "Second!"}],
"title": "Welcome to the weblog"},
{"comments": [{"body": "Don't think too hard"}],
"title": "So I was thinking"}]}
56 57 58 |
# File 'lib/active_record/serializers/json_serializer.rb', line 56 def to_json( = {}) JsonSerializer.new(self, ).to_s end |
#to_xml(options = {}, &block) ⇒ Object
Builds an XML document to represent the model. Some configuration is
available through options, however more complicated cases should
override ActiveRecord's to_xml.
By default the generated XML document will include the processing instruction and all object's attributes. For example:
This behavior can be controlled with :only, :except, :skip_instruct, :skip_types and :dasherize. The :only and :except options are the same as for the #attributes method. The default is to dasherize all column names, to disable this, set :dasherize to false. To not have the column type included in the XML output, set :skip_types to true.
For instance:
topic.to_xml(:skip_instruct => true, :except => [ :id, :bonus_time, :written_on, :replies_count ])
To include first level associations use :include
firm.to_xml :include => [ :account, :clients ]
To include any methods on the object(s) being called use :methods
firm.to_xml :methods => [ :calculated_earnings, :real_earnings ]
To call any Proc's on the object(s) use :procs. The Proc's are passed a modified version of the options hash that was given to #to_xml.
proc = Proc.new { || [:builder].tag!('abc', 'def') }
firm.to_xml :procs => [ proc ]
Alternatively, you can also just yield the builder object as part of the to_xml call:
firm.to_xml do |xml|
xml.creator do
xml.first_name "David"
xml.last_name "Heinemeier Hansson"
end
end
You can override the to_xml method in your ActiveRecord::Base subclasses if you need to. The general form of doing this is
class IHaveMyOwnXML < ActiveRecord::Base
def to_xml( = {})
[:indent] ||= 2
xml = [:builder] ||= Builder::XmlMarkup.new(:indent => [:indent])
xml.instruct! unless [:skip_instruct]
xml.level_one do
xml.tag!(:second_level, 'content')
end
end
end
123 124 125 126 |
# File 'lib/active_record/serializers/xml_serializer.rb', line 123 def to_xml( = {}, &block) serializer = XmlSerializer.new(self, ) block_given? ? serializer.to_s(&block) : serializer.to_s end |