From 6860318133a1d5b1f61d4c51bc3c7d0b4a3f8205 Mon Sep 17 00:00:00 2001 From: Lucas Hosseini Date: Wed, 30 Dec 2015 17:25:41 +0100 Subject: [PATCH] Add support for if/unless on associations. --- CHANGELOG.md | 1 + lib/active_model/serializer/associations.rb | 1 + lib/active_model/serializer/reflection.rb | 26 +++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5f8bd834..a89c9e05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ Breaking changes: Features: +- [#1403](https://github.com/rails-api/active_model_serializers/pull/1403) Add support for if/unless on attributes/associations (@beauby) - [#1248](https://github.com/rails-api/active_model_serializers/pull/1248) Experimental: Add support for JSON API deserialization (@beauby) - [#1378](https://github.com/rails-api/active_model_serializers/pull/1378) Change association blocks to be evaluated in *serializer* scope, rather than *association* scope. (@bf4) diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 42e872ce..fe4bfe1f 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -88,6 +88,7 @@ module ActiveModel Enumerator.new do |y| self.class._reflections.each do |reflection| + next unless reflection.included?(self) key = reflection.options.fetch(:key, reflection.name) next unless include_tree.key?(key) y.yield reflection.build_association(self, instance_options) diff --git a/lib/active_model/serializer/reflection.rb b/lib/active_model/serializer/reflection.rb index 19eb78b8..484b95ae 100644 --- a/lib/active_model/serializer/reflection.rb +++ b/lib/active_model/serializer/reflection.rb @@ -35,6 +35,18 @@ module ActiveModel end end + # @api private + def included?(serializer) + case condition_type + when :if + serializer.public_send(condition) + when :unless + !serializer.public_send(condition) + else + true + end + end + # Build association. This method is used internally to # build serializer's association by its reflection. # @@ -79,6 +91,20 @@ module ActiveModel private + def condition_type + if options.key?(:if) + :if + elsif options.key?(:unless) + :unless + else + :none + end + end + + def condition + options[condition_type] + end + def serializer_options(subject, parent_serializer_options, reflection_options) serializer = reflection_options.fetch(:serializer, nil)