module KakurenboPuti::ActiveRecordBase::Initializers

Public Class Methods

create_callbacks(target_class) click to toggle source

Create callbacks. @param [Class] target_class Class of target.

# File lib/kakurenbo_puti/active_record_base.rb, line 21
def self.create_callbacks(target_class)
  target_class.class_eval do
    define_model_callbacks :restore
    define_model_callbacks :soft_destroy
  end
end
create_column_name_accessors(target_class, column) click to toggle source

Create attribute_accessors of column_name. @param [Class] target_class Class of target. @param [Symbol] column Name of column.

# File lib/kakurenbo_puti/active_record_base.rb, line 31
def self.create_column_name_accessors(target_class, column)
  target_class.class_eval do
    define_singleton_method(:soft_delete_column) { column }
    delegate :soft_delete_column, to: :class
  end
end
create_scopes(target_class, dependent_associations) click to toggle source

Create scopes. @param [Class] target_class Class of target. @param [Array<Symbol>] dependent_associations Names of dependency association.

# File lib/kakurenbo_puti/active_record_base.rb, line 41
def self.create_scopes(target_class, dependent_associations)
  target_class.class_eval do
    scope :only_soft_destroyed, -> { where.not(id: without_soft_destroyed.select(:id)) }

    scope :without_soft_destroyed, (lambda do
      dependent_associations.inject(where(soft_delete_column => nil)) do |relation, name|
        association = relation.klass.reflect_on_all_associations.find{|a| a.name == name }
        raise 'dependent association is usable only in `belongs_to`.' unless association.belongs_to?

        parent_relation = association.klass.all
        if association.klass.method_defined?(:soft_delete_column)
          parent_relation = parent_relation.without_soft_destroyed
        end
        relation.where(association.foreign_key => parent_relation.select(:id))
      end
    end)
  end
end