active_model_serializers 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +3 -3
- data/CHANGELOG.md +61 -0
- data/DESIGN.textile +2 -2
- data/Gemfile +3 -1
- data/README.md +44 -21
- data/Rakefile +5 -0
- data/active_model_serializers.gemspec +2 -1
- data/bench/perf.rb +43 -0
- data/lib/action_controller/serialization.rb +8 -25
- data/lib/active_model/array_serializer.rb +58 -20
- data/lib/active_model/serializer.rb +132 -16
- data/lib/active_model/serializer/associations.rb +17 -10
- data/lib/active_model/serializers/version.rb +1 -1
- data/lib/active_model_serializers.rb +20 -8
- data/lib/active_record/serializer_override.rb +16 -0
- data/lib/generators/serializer/serializer_generator.rb +3 -2
- data/lib/generators/serializer/templates/serializer.rb +11 -0
- data/test/array_serializer_test.rb +0 -1
- data/test/association_test.rb +103 -0
- data/test/caching_test.rb +96 -0
- data/test/generators_test.rb +16 -2
- data/test/no_serialization_scope_test.rb +1 -1
- data/test/serialization_scope_name_test.rb +67 -0
- data/test/serialization_test.rb +1 -1
- data/test/serializer_support_test.rb +10 -0
- data/test/serializer_test.rb +142 -3
- data/test/test_fakes.rb +12 -0
- data/test/test_helper.rb +8 -7
- metadata +25 -4
- data/RELEASE_NOTES.md +0 -15
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 806e6040b82178f17890aaa7d76e431ebf41fac6
|
|
4
|
+
data.tar.gz: 68562583b4d96f5e7baf0e35f86d39d6f8267cb1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 33e9ffa81d5121eb929e83e50c80b16fb68a322210dddcaea36396ea18ac4fb1c2862ff025a175fe87e7a70d85bc5208866e7ee2f3aa3093dda503a229652429
|
|
7
|
+
data.tar.gz: 672a0655b5d4dd8d93003d4c18d6b2606e804d381fbe3d5777d46ec04711ae5a81a26a95b34c9d796c4ceb34abd800f2685f343c33f60a23a544df9db6754ad9
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
language: ruby
|
|
2
|
-
before_install:
|
|
3
|
-
- gem install bundler
|
|
4
2
|
rvm:
|
|
5
3
|
- 1.8.7
|
|
6
4
|
- 1.9.2
|
|
7
5
|
- 1.9.3
|
|
8
|
-
-
|
|
6
|
+
- 2.0.0
|
|
9
7
|
- ree
|
|
10
8
|
- jruby-18mode
|
|
11
9
|
- jruby-19mode
|
|
@@ -15,6 +13,8 @@ gemfile:
|
|
|
15
13
|
- Gemfile
|
|
16
14
|
- Gemfile.edge
|
|
17
15
|
matrix:
|
|
16
|
+
allow_failures:
|
|
17
|
+
- gemfile: Gemfile.edge
|
|
18
18
|
exclude:
|
|
19
19
|
# Edge Rails is only compatible with 1.9.3
|
|
20
20
|
- gemfile: Gemfile.edge
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# UNRELEASED
|
|
2
|
+
|
|
3
|
+
# VERSION 0.8.0
|
|
4
|
+
|
|
5
|
+
* Attributes can now have optional types.
|
|
6
|
+
|
|
7
|
+
* A new DefaultSerializer ensures that POROs behave the same way as ActiveModels.
|
|
8
|
+
|
|
9
|
+
* If you wish to override ActiveRecord::Base#to_Json, you can now require
|
|
10
|
+
'active_record/serializer_override'. We don't recommend you do this, but
|
|
11
|
+
many users do, so we've left it optional.
|
|
12
|
+
|
|
13
|
+
* Fixed a bug where ActionController wouldn't always have MimeResponds.
|
|
14
|
+
|
|
15
|
+
* An optinal caching feature allows you to cache JSON & hashes that AMS uses.
|
|
16
|
+
Adding 'cached true' to your Serializers will turn on this cache.
|
|
17
|
+
|
|
18
|
+
* URL helpers used inside of Engines now work properly.
|
|
19
|
+
|
|
20
|
+
* Serializers now can filter attributes with `only` and `except`:
|
|
21
|
+
|
|
22
|
+
UserSerializer.new(user, only: [:first_name, :last_name])
|
|
23
|
+
UserSerializer.new(user, except: :first_name)
|
|
24
|
+
|
|
25
|
+
* Basic Mongoid support. We now include our mixins in the right place.
|
|
26
|
+
|
|
27
|
+
* On Ruby 1.8, we now generate an `id` method that properly serializes `id`
|
|
28
|
+
columns. See issue #127 for more.
|
|
29
|
+
|
|
30
|
+
* Add an alias for `scope` method to be the name of the context. By default
|
|
31
|
+
this is `current_user`. The name is automatically set when using
|
|
32
|
+
`serialization_scope` in the controller.
|
|
33
|
+
|
|
34
|
+
* Pass through serialization options (such as `:include`) when a model
|
|
35
|
+
has no serializer defined.
|
|
36
|
+
|
|
37
|
+
# VERSION 0.7.0
|
|
38
|
+
|
|
39
|
+
* ```embed_key``` option to allow embedding by attributes other than IDs
|
|
40
|
+
* Fix rendering nil with custom serializer
|
|
41
|
+
* Fix global ```self.root = false```
|
|
42
|
+
* Add support for specifying the serializer for an association as a String
|
|
43
|
+
* Able to specify keys on the attributes method
|
|
44
|
+
* Serializer Reloading via ActiveSupport::DescendantsTracker
|
|
45
|
+
* Reduce double map to once; Fixes datamapper eager loading.
|
|
46
|
+
|
|
47
|
+
# VERSION 0.6.0
|
|
48
|
+
|
|
49
|
+
* Serialize sets properly
|
|
50
|
+
* Add root option to ArraySerializer
|
|
51
|
+
* Support polymorphic associations
|
|
52
|
+
* Support :each_serializer in ArraySerializer
|
|
53
|
+
* Add `scope` method to easily access the scope in the serializer
|
|
54
|
+
* Fix regression with Rails 3.2.6; add Rails 4 support
|
|
55
|
+
* Allow serialization_scope to be disabled with serialization_scope nil
|
|
56
|
+
* Array serializer should support pure ruby objects besides serializers
|
|
57
|
+
|
|
58
|
+
# VERSION 0.5.0 (May 16, 2012)
|
|
59
|
+
|
|
60
|
+
* First tagged version
|
|
61
|
+
* Changes generators to always generate an ApplicationSerializer
|
data/DESIGN.textile
CHANGED
|
@@ -217,7 +217,7 @@ First, we specified the list of included attributes at the top of the class. Thi
|
|
|
217
217
|
|
|
218
218
|
NOTE: Internally, +ActiveModel::Serializer+ uses +read_attribute_for_serialization+, which defaults to +read_attribute+, which defaults to +send+. So if you're rolling your own models for use with the serializer, you can use simple Ruby accessors for your attributes if you like.
|
|
219
219
|
|
|
220
|
-
Next, we use the attributes
|
|
220
|
+
Next, we use the attributes method in our +serializable_hash+ method, which allowed us to eliminate the +post+ method we hand-rolled
|
|
221
221
|
earlier. We could also eliminate the +as_json+ method, as +ActiveModel::Serializer+ provides a default +as_json+ method for
|
|
222
222
|
us that calls our +serializable_hash+ method and inserts a root. But we can go a step further!
|
|
223
223
|
|
|
@@ -354,7 +354,7 @@ h4. Modifying Associations
|
|
|
354
354
|
You can also rename associations if required. Say for example you have an association that
|
|
355
355
|
makes sense to be named one thing in your code, but another when data is serialized.
|
|
356
356
|
You can use the <code:key</code> option to specify a different name for an association.
|
|
357
|
-
Here is an
|
|
357
|
+
Here is an example:
|
|
358
358
|
|
|
359
359
|
<pre lang="ruby">
|
|
360
360
|
class UserSerializer < ActiveModel::Serializer
|
data/Gemfile
CHANGED
data/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
[](https://travis-ci.org/rails-api/active_model_serializers) [](https://codeclimate.com/github/rails-api/active_model_serializers) [](https://coveralls.io/r/rails-api/active_model_serializers)
|
|
2
2
|
|
|
3
3
|
# Purpose
|
|
4
4
|
|
|
@@ -10,16 +10,16 @@ Serializers know about both a model and the `current_user`, so you can
|
|
|
10
10
|
customize serialization based upon whether a user is authorized to see the
|
|
11
11
|
content.
|
|
12
12
|
|
|
13
|
-
In short, **serializers
|
|
13
|
+
In short, **serializers replace hash-driven development with object-oriented
|
|
14
14
|
development.**
|
|
15
15
|
|
|
16
16
|
# Installing Serializers
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
The easiest way to install `ActiveModel::Serializers` is to add it to your
|
|
19
|
+
`Gemfile`:
|
|
20
20
|
|
|
21
21
|
```ruby
|
|
22
|
-
gem "active_model_serializers", "~> 0.
|
|
22
|
+
gem "active_model_serializers", "~> 0.7.0"
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
Then, install it on the command line:
|
|
@@ -48,10 +48,14 @@ $ rails g serializer post
|
|
|
48
48
|
### Support for PORO's and other ORM's.
|
|
49
49
|
|
|
50
50
|
Currently `ActiveModel::Serializers` adds serialization support to all models
|
|
51
|
-
that descend from `ActiveRecord
|
|
52
|
-
using objects that are `ActiveModel`
|
|
53
|
-
|
|
54
|
-
`
|
|
51
|
+
that descend from `ActiveRecord` or include `Mongoid::Document`. If you are
|
|
52
|
+
using another ORM, or if you are using objects that are `ActiveModel`
|
|
53
|
+
compliant but do not descend from `ActiveRecord` or include
|
|
54
|
+
`Mongoid::Document`, you must add an include statement for
|
|
55
|
+
`ActiveModel::SerializerSupport` to make models serializable. If you
|
|
56
|
+
also want to make collections serializable, you should include
|
|
57
|
+
`ActiveModel::ArraySerializationSupport` into your ORM's
|
|
58
|
+
relation/criteria class.
|
|
55
59
|
|
|
56
60
|
# ActiveModel::Serializer
|
|
57
61
|
|
|
@@ -135,7 +139,7 @@ render :json => @posts, :root => "some_posts"
|
|
|
135
139
|
```
|
|
136
140
|
|
|
137
141
|
You may disable the root element for arrays at the top level, which will result in
|
|
138
|
-
more concise json. To disable the root element for arrays, you have
|
|
142
|
+
more concise json. To disable the root element for arrays, you have 4 options:
|
|
139
143
|
|
|
140
144
|
#### 1. Disable root globally for in `ArraySerializer`. In an initializer:
|
|
141
145
|
|
|
@@ -181,7 +185,7 @@ render :json => @posts, :each_serializer => FancyPostSerializer
|
|
|
181
185
|
|
|
182
186
|
If you define `default_serializer_options` method in your controller,
|
|
183
187
|
all serializers in actions of this controller and it's children will use them.
|
|
184
|
-
One of options may be `root: false`
|
|
188
|
+
One of the options may be `root: false`
|
|
185
189
|
|
|
186
190
|
```ruby
|
|
187
191
|
def default_serializer_options
|
|
@@ -232,22 +236,36 @@ end
|
|
|
232
236
|
Within a serializer's methods, you can access the object being
|
|
233
237
|
serialized as `object`.
|
|
234
238
|
|
|
235
|
-
You can also access the `
|
|
236
|
-
authorization context to your serializer. By default,
|
|
239
|
+
You can also access the `current_user` method, which provides an
|
|
240
|
+
authorization context to your serializer. By default, the context
|
|
237
241
|
is the current user of your application, but this
|
|
238
242
|
[can be customized](#customizing-scope).
|
|
239
243
|
|
|
240
244
|
Serializers will check for the presence of a method named
|
|
241
245
|
`include_[ATTRIBUTE]?` to determine whether a particular attribute should be
|
|
242
246
|
included in the output. This is typically used to customize output
|
|
243
|
-
based on `
|
|
247
|
+
based on `current_user`. For example:
|
|
244
248
|
|
|
245
249
|
```ruby
|
|
246
250
|
class PostSerializer < ActiveModel::Serializer
|
|
247
251
|
attributes :id, :title, :body, :author
|
|
248
252
|
|
|
249
253
|
def include_author?
|
|
250
|
-
|
|
254
|
+
current_user.admin?
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
The type of a computed attribute (like :full_name above) is not easily
|
|
260
|
+
calculated without some sophisticated static code analysis. To specify the
|
|
261
|
+
type of a computed attribute:
|
|
262
|
+
|
|
263
|
+
```ruby
|
|
264
|
+
class PersonSerializer < ActiveModel::Serializer
|
|
265
|
+
attributes :first_name, :last_name, {:full_name => :string}
|
|
266
|
+
|
|
267
|
+
def full_name
|
|
268
|
+
"#{object.first_name} #{object.last_name}"
|
|
251
269
|
end
|
|
252
270
|
end
|
|
253
271
|
```
|
|
@@ -311,7 +329,7 @@ class PersonSerializer < ActiveModel::Serializer
|
|
|
311
329
|
|
|
312
330
|
def attributes
|
|
313
331
|
hash = super
|
|
314
|
-
if
|
|
332
|
+
if current_user.admin?
|
|
315
333
|
hash["ssn"] = object.ssn
|
|
316
334
|
hash["secret"] = object.mothers_maiden_name
|
|
317
335
|
end
|
|
@@ -339,7 +357,7 @@ class PostSerializer < ActiveModel::Serializer
|
|
|
339
357
|
|
|
340
358
|
# only let the user see comments he created.
|
|
341
359
|
def comments
|
|
342
|
-
object.comments.where(:created_by =>
|
|
360
|
+
object.comments.where(:created_by => current_user)
|
|
343
361
|
end
|
|
344
362
|
end
|
|
345
363
|
```
|
|
@@ -381,7 +399,7 @@ class PostSerializer < ActiveModel::Serializer
|
|
|
381
399
|
has_many :comments
|
|
382
400
|
|
|
383
401
|
def include_associations!
|
|
384
|
-
include! :author if
|
|
402
|
+
include! :author if current_user.admin?
|
|
385
403
|
include! :comments unless object.comments_disabled?
|
|
386
404
|
end
|
|
387
405
|
end
|
|
@@ -394,6 +412,8 @@ You may also use the `:serializer` option to specify a custom serializer class a
|
|
|
394
412
|
has_one :reviewer, :polymorphic => true
|
|
395
413
|
```
|
|
396
414
|
|
|
415
|
+
Serializers are only concerned with multiplicity, and not ownership. `belongs_to` ActiveRecord associations can be included using `has_one` in your serializer.
|
|
416
|
+
|
|
397
417
|
## Embedding Associations
|
|
398
418
|
|
|
399
419
|
By default, associations will be embedded inside the serialized object. So if
|
|
@@ -573,7 +593,7 @@ Ajax requests, you probably just want to use the default embedded behavior.
|
|
|
573
593
|
|
|
574
594
|
## Customizing Scope
|
|
575
595
|
|
|
576
|
-
In a serializer, `
|
|
596
|
+
In a serializer, `current_user` is the current authorization scope which the controller
|
|
577
597
|
provides to the serializer when you call `render :json`. By default, this is
|
|
578
598
|
`current_user`, but can be customized in your controller by calling
|
|
579
599
|
`serialization_scope`:
|
|
@@ -584,6 +604,9 @@ class ApplicationController < ActionController::Base
|
|
|
584
604
|
end
|
|
585
605
|
```
|
|
586
606
|
|
|
607
|
+
The above example will also change the scope name from `current_user` to
|
|
608
|
+
`current_admin`.
|
|
609
|
+
|
|
587
610
|
Please note that, until now, `serialization_scope` doesn't accept a second
|
|
588
611
|
object with options for specifying which actions should or should not take a
|
|
589
612
|
given scope in consideration.
|
|
@@ -612,12 +635,12 @@ class CitiesController < ApplicationController
|
|
|
612
635
|
def show
|
|
613
636
|
@city = City.find(params[:id])
|
|
614
637
|
|
|
615
|
-
render :json => @city, :scope => current_admin
|
|
638
|
+
render :json => @city, :scope => current_admin, :scope_name => :current_admin
|
|
616
639
|
end
|
|
617
640
|
end
|
|
618
641
|
```
|
|
619
642
|
|
|
620
|
-
Assuming that the `current_admin
|
|
643
|
+
Assuming that the `current_admin` method needs to make a query in the database
|
|
621
644
|
for the current user, the advantage of this approach is that, by setting
|
|
622
645
|
`serialization_scope` to `nil`, the `index` action no longer will need to make
|
|
623
646
|
that query, only the `show` action will.
|
data/Rakefile
CHANGED
|
@@ -8,7 +8,7 @@ Gem::Specification.new do |gem|
|
|
|
8
8
|
gem.email = ["jose.valim@gmail.com", "wycats@gmail.com"]
|
|
9
9
|
gem.description = %q{Making it easy to serialize models for client-side use}
|
|
10
10
|
gem.summary = %q{Bringing consistency and object orientation to model serialization. Works great for client-side MVC frameworks!}
|
|
11
|
-
gem.homepage = "https://github.com/
|
|
11
|
+
gem.homepage = "https://github.com/rails-api/active_model_serializers"
|
|
12
12
|
|
|
13
13
|
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
|
14
14
|
gem.files = `git ls-files`.split("\n")
|
|
@@ -21,4 +21,5 @@ Gem::Specification.new do |gem|
|
|
|
21
21
|
gem.add_development_dependency "rails", ">= 3.0"
|
|
22
22
|
gem.add_development_dependency "pry"
|
|
23
23
|
gem.add_development_dependency "simplecov"
|
|
24
|
+
gem.add_development_dependency "coveralls"
|
|
24
25
|
end
|
data/bench/perf.rb
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require "rubygems"
|
|
2
|
+
require "bundler/setup"
|
|
3
|
+
require "active_model_serializers"
|
|
4
|
+
require "active_support/json"
|
|
5
|
+
require "benchmark"
|
|
6
|
+
|
|
7
|
+
class User < Struct.new(:id,:name,:age,:about)
|
|
8
|
+
include ActiveModel::SerializerSupport
|
|
9
|
+
|
|
10
|
+
def fast_hash
|
|
11
|
+
h = {
|
|
12
|
+
id: read_attribute_for_serialization(:id),
|
|
13
|
+
name: read_attribute_for_serialization(:name),
|
|
14
|
+
about: read_attribute_for_serialization(:about)
|
|
15
|
+
}
|
|
16
|
+
h[:age] = read_attribute_for_serialization(:age) if age > 18
|
|
17
|
+
h
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class UserSerializer < ActiveModel::Serializer
|
|
22
|
+
attributes :id, :name, :age, :about
|
|
23
|
+
|
|
24
|
+
def include_age?
|
|
25
|
+
object.age > 18
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
u = User.new(1, "sam", 10, "about")
|
|
32
|
+
s = UserSerializer.new(u)
|
|
33
|
+
|
|
34
|
+
n = 100000
|
|
35
|
+
|
|
36
|
+
Benchmark.bmbm {|x|
|
|
37
|
+
x.report("init") { n.times { UserSerializer.new(u) } }
|
|
38
|
+
x.report("fast_hash") { n.times { u.fast_hash } }
|
|
39
|
+
x.report("attributes") { n.times { UserSerializer.new(u).attributes } }
|
|
40
|
+
x.report("serializable_hash") { n.times { UserSerializer.new(u).serializable_hash } }
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
|
|
@@ -2,7 +2,7 @@ module ActionController
|
|
|
2
2
|
# Action Controller Serialization
|
|
3
3
|
#
|
|
4
4
|
# Overrides render :json to check if the given object implements +active_model_serializer+
|
|
5
|
-
# as a method. If so, use the returned serializer instead of calling +to_json+
|
|
5
|
+
# as a method. If so, use the returned serializer instead of calling +to_json+ on the object.
|
|
6
6
|
#
|
|
7
7
|
# This module also provides a serialization_scope method that allows you to configure the
|
|
8
8
|
# +serialization_scope+ of the serializer. Most apps will likely set the +serialization_scope+
|
|
@@ -33,37 +33,20 @@ module ActionController
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def serialization_scope
|
|
36
|
-
send(_serialization_scope) if _serialization_scope && respond_to?(_serialization_scope)
|
|
36
|
+
send(_serialization_scope) if _serialization_scope && respond_to?(_serialization_scope, true)
|
|
37
37
|
end
|
|
38
38
|
|
|
39
39
|
def default_serializer_options
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
-
def _render_option_json(
|
|
43
|
-
|
|
42
|
+
def _render_option_json(resource, options)
|
|
43
|
+
json = ActiveModel::Serializer.build_json(self, resource, options)
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
(json
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
unless serializer <= ActiveModel::ArraySerializer
|
|
50
|
-
raise ArgumentError.new("#{serializer.name} is not an ArraySerializer. " +
|
|
51
|
-
"You may want to use the :each_serializer option instead.")
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
if options[:root] != false && serializer.root != false
|
|
55
|
-
# default root element for arrays is serializer's root or the controller name
|
|
56
|
-
# the serializer for an Array is ActiveModel::ArraySerializer
|
|
57
|
-
options[:root] ||= serializer.root || controller_name
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
if serializer
|
|
62
|
-
options[:scope] = serialization_scope unless options.has_key?(:scope)
|
|
63
|
-
options[:url_options] = url_options
|
|
64
|
-
json = serializer.new(json, options)
|
|
45
|
+
if json
|
|
46
|
+
super(json, options)
|
|
47
|
+
else
|
|
48
|
+
super
|
|
65
49
|
end
|
|
66
|
-
super
|
|
67
50
|
end
|
|
68
51
|
|
|
69
52
|
module ClassMethods
|
|
@@ -5,7 +5,7 @@ require 'active_support/descendants_tracker'
|
|
|
5
5
|
module ActiveModel
|
|
6
6
|
# Active Model Array Serializer
|
|
7
7
|
#
|
|
8
|
-
#
|
|
8
|
+
# Serializes an Array, checking if each element implements
|
|
9
9
|
# the +active_model_serializer+ method.
|
|
10
10
|
#
|
|
11
11
|
# To disable serialization of root elements:
|
|
@@ -19,28 +19,20 @@ module ActiveModel
|
|
|
19
19
|
|
|
20
20
|
class_attribute :root
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def serializable_array
|
|
27
|
-
@object.map do |item|
|
|
28
|
-
if @options.has_key? :each_serializer
|
|
29
|
-
serializer = @options[:each_serializer]
|
|
30
|
-
elsif item.respond_to?(:active_model_serializer)
|
|
31
|
-
serializer = item.active_model_serializer
|
|
32
|
-
end
|
|
22
|
+
class_attribute :cache
|
|
23
|
+
class_attribute :perform_caching
|
|
33
24
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
else
|
|
39
|
-
serializable.as_json
|
|
40
|
-
end
|
|
25
|
+
class << self
|
|
26
|
+
# set perform caching like root
|
|
27
|
+
def cached(value = true)
|
|
28
|
+
self.perform_caching = value
|
|
41
29
|
end
|
|
42
30
|
end
|
|
43
31
|
|
|
32
|
+
def initialize(object, options={})
|
|
33
|
+
@object, @options = object, options
|
|
34
|
+
end
|
|
35
|
+
|
|
44
36
|
def meta_key
|
|
45
37
|
@options[:meta_key].try(:to_sym) || :meta
|
|
46
38
|
end
|
|
@@ -61,6 +53,52 @@ module ActiveModel
|
|
|
61
53
|
serializable_array
|
|
62
54
|
end
|
|
63
55
|
end
|
|
64
|
-
end
|
|
65
56
|
|
|
57
|
+
def to_json(*args)
|
|
58
|
+
if perform_caching?
|
|
59
|
+
cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'to-json']) do
|
|
60
|
+
super
|
|
61
|
+
end
|
|
62
|
+
else
|
|
63
|
+
super
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def serializable_array
|
|
68
|
+
if perform_caching?
|
|
69
|
+
cache.fetch expand_cache_key([self.class.to_s.underscore, cache_key, 'serializable-array']) do
|
|
70
|
+
_serializable_array
|
|
71
|
+
end
|
|
72
|
+
else
|
|
73
|
+
_serializable_array
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
def _serializable_array
|
|
79
|
+
@object.map do |item|
|
|
80
|
+
if @options.has_key? :each_serializer
|
|
81
|
+
serializer = @options[:each_serializer]
|
|
82
|
+
elsif item.respond_to?(:active_model_serializer)
|
|
83
|
+
serializer = item.active_model_serializer
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
serializable = serializer ? serializer.new(item, @options) : DefaultSerializer.new(item, @options)
|
|
87
|
+
|
|
88
|
+
if serializable.respond_to?(:serializable_hash)
|
|
89
|
+
serializable.serializable_hash
|
|
90
|
+
else
|
|
91
|
+
serializable.as_json
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def expand_cache_key(*args)
|
|
97
|
+
ActiveSupport::Cache.expand_cache_key(args)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def perform_caching?
|
|
101
|
+
perform_caching && cache && respond_to?(:cache_key)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
66
104
|
end
|