anyone-oslo/localizable_model

View on GitHub
lib/localizable_model/active_record_extension.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

module LocalizableModel
  # = LocalizableModel::ActiveRecordExtension
  #
  # Extends ActiveRecord::Base with the localizable setup method.
  #
  module ActiveRecordExtension
    # Extends the model with Localizable features.
    # It takes an optional block as argument, which yields an instance of
    # LocalizableModel::Configuration.
    #
    # Example:
    #
    #  class Page < ActiveRecord::Base
    #    localizable do
    #      attribute :name
    #      attribute :body
    #    end
    #  end
    #
    def localizable(&)
      extend_with_localizable_model!
      localizable_configuration.instance_eval(&) if block_given?
      define_localizable_methods!
    end

    def extend_with_localizable_model!
      return if is_a?(LocalizableModel::ClassMethods)

      send :extend,  LocalizableModel::ClassMethods
      send :include, LocalizableModel::InstanceMethods
      has_many(:localizations,
               as: :localizable,
               dependent: :destroy,
               autosave: true)
      before_save :cleanup_localizations!
    end
  end
end

ActiveSupport.on_load(:active_record) do
  extend LocalizableModel::ActiveRecordExtension
end