Sha256: 5751170ca2dacea3275a7e2977ccf93b2561279f385619046c1bc9c5f88febd0

Contents?: true

Size: 1.27 KB

Versions: 2

Compression:

Stored size: 1.27 KB

Contents

require "scenic"

module SearchCraft::Model
  # Maintain a list of classes that include this module
  @included_classes = []

  # Class method to add a class to the list of included classes
  def self.included(base)
    if base.is_a?(Class)
      base.extend ClassMethods

      if base.is_a?(ClassMethods) && base.respond_to?(:table_name=)
        base.table_name = base.name.to_s.tableize.tr("/", "_")

        @included_classes << base unless @included_classes.include?(base)
      end
    end
    super
  end

  # Runs .refresh! on all classes that include SearchCraft::Model
  def self.refresh_all!
    included_classes.each do |klass|
      warn "Refreshing materialized view #{klass.table_name}..." unless Rails.env.test?
      if klass.is_a?(ClassMethods)
        klass.refresh!
      end
    end
  end

  def self.included_classes
    @included_classes | if SearchCraft.config.explicit_model_class_names
      SearchCraft.config.explicit_model_class_names.map(&:constantize)
    else
      []
    end
  end

  module ClassMethods
    def refresh!
      Scenic.database.refresh_materialized_view(table_name, concurrently: @refresh_concurrently, cascade: false)
    end

    def refresh_concurrently=(value)
      @refresh_concurrently = value
    end
  end

  def read_only?
    true
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
searchcraft-0.4.2 lib/searchcraft/model.rb
searchcraft-0.4.1 lib/searchcraft/model.rb