Sha256: 0d4747eb777e756b97d0c50229f60b58013d344791bb92f195d5186aeefae3a5

Contents?: true

Size: 1.64 KB

Versions: 1

Compression:

Stored size: 1.64 KB

Contents

module Mongoid
  module Archivable
    # loops through all fields on document, as well as on its embedded relations
    # and makes sure all attributes that belong to localized fields are assigned
    # via their *_translations writer
    class ProcessLocalizedFields < Struct.new(:cls, :attrs)
      def self.call(*args)
        new(*args).call
      end

      def initialize(cls, attrs = {})
        super(cls, attrs)
      end

      def call
        attrs = convert_fields

        embedded_relations.each do |relation|
          relation_name = relation.name.to_s

          # convert embeds_many
          if attrs[relation_name].is_a?(Array)
            attrs[relation_name] = attrs[relation_name].map do |att|
              relation_class = att.fetch('_type', relation.class_name).constantize
              ProcessLocalizedFields.call(relation_class, att)
            end
          # convert embeds_one
          elsif att = attrs[relation_name]
            relation_class = att.fetch('_type', relation.class_name).constantize
            attrs[relation_name] = ProcessLocalizedFields.call(relation_class, att)
          end
        end

        attrs
      end

      private

      def localized_fields
        cls.fields.values.select(&:localized?)
      end

      def localized_field_names
        localized_fields.map(&:name)
      end

      def convert_fields
        attrs.map do |name, value|
          if localized_field_names.include?(name.to_s)
            name = "#{name}_translations"
          end
          [name, value]
        end.to_h
      end

      def embedded_relations
        cls.relations.values.select(&:embedded?)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
mongoid-archivable-1.7.0 lib/mongoid/archivable/process_localized_fields.rb