From 1482081766d3ccac9930bb1f013776d1fbe7289a Mon Sep 17 00:00:00 2001 From: Gosha Arinich Date: Sun, 5 May 2013 10:35:44 +0300 Subject: [PATCH] add support of mongoid collection serialization --- README.md | 12 ++++++++---- lib/active_model_serializers.rb | 16 ++++++++-------- test/serializer_support_test.rb | 10 ++++++++++ 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 41214c72..efd998e3 100644 --- a/README.md +++ b/README.md @@ -48,10 +48,14 @@ $ rails g serializer post ### Support for PORO's and other ORM's. Currently `ActiveModel::Serializers` adds serialization support to all models -that descend from `ActiveRecord`. If you are using another ORM, or if you are -using objects that are `ActiveModel` compliant but do not descend from -`ActiveRecord`, you must add an include statement for -`ActiveModel::SerializerSupport`. +that descend from `ActiveRecord` or include `Mongoid::Document`. If you are +using another ORM, or if you are using objects that are `ActiveModel` +compliant but do not descend from `ActiveRecord` or include +`Mongoid::Document`, you must add an include statement for +`ActiveModel::SerializerSupport` to make models serializable. If you +also want to make collections serializable, you should include +`ActiveModel::ArraySerializationSupport` into your ORM's +relation/criteria class. # ActiveModel::Serializer diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index 95a931b9..a708585c 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -64,12 +64,6 @@ module ActiveModel::SerializerSupport alias :read_attribute_for_serialization :send end -[:active_record, :mongoid].each do |orm| - ActiveSupport.on_load(orm) do - include ActiveModel::SerializerSupport - end -end - module ActiveModel::ArraySerializerSupport def active_model_serializer ActiveModel::ArraySerializer @@ -79,8 +73,14 @@ end Array.send(:include, ActiveModel::ArraySerializerSupport) Set.send(:include, ActiveModel::ArraySerializerSupport) -ActiveSupport.on_load(:active_record) do - ActiveRecord::Relation.send(:include, ActiveModel::ArraySerializerSupport) +{ + :active_record => 'ActiveRecord::Relation', + :mongoid => 'Mongoid::Criteria' +}.each do |orm, rel_class| + ActiveSupport.on_load(orm) do + include ActiveModel::SerializerSupport + rel_class.constantize.send(:include, ActiveModel::ArraySerializerSupport) + end end begin diff --git a/test/serializer_support_test.rb b/test/serializer_support_test.rb index e82f1fb1..03bd130f 100644 --- a/test/serializer_support_test.rb +++ b/test/serializer_support_test.rb @@ -20,6 +20,11 @@ module ActiveRecord end end +module Mongoid + class Criteria + end +end + class SerializerSupportTest < ActiveModel::TestCase test "it returns nil if no serializer exists" do assert_equal nil, RandomModel.new.active_model_serializer @@ -37,5 +42,10 @@ class SerializerSupportTest < ActiveModel::TestCase ActiveSupport.run_load_hooks(:active_record) assert_equal ActiveModel::ArraySerializer, ActiveRecord::Relation.new.active_model_serializer end + + test "it automatically includes array_serializer in mongoid/criteria" do + ActiveSupport.run_load_hooks(:mongoid) + assert_equal ActiveModel::ArraySerializer, Mongoid::Criteria.new.active_model_serializer + end end