Class: Listable::ViewManager

Inherits:
Object
  • Object
show all
Defined in:
lib/listable/view_manager.rb

Class Method Summary collapse

Class Method Details

.add_listable(view_name, model_name, model_scope_name) ⇒ Object



17
18
19
20
21
# File 'lib/listable/view_manager.rb', line 17

def add_listable(view_name, model_name, model_scope_name)
  @@listables ||= {}
  @@listables[view_name] ||= {}
  @@listables[view_name][model_name] = model_scope_name
end

.create_viewsObject



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/listable/view_manager.rb', line 27

def create_views
  return if listables.nil?
  ActiveRecord::Base.transaction do
    drop_views # First drop all listable views to get a fresh start
    listables.each do |view_name, query_info|
      queries = []
      view_name = prefixed_view_name(view_name.to_s) # Appending a prefix to views
      query_info.each do |model_name, scope|
        model_class = Kernel.const_get(model_name)
        table_name = model_class.table_name
        query = model_class.select_as("#{table_name}.id" => :listable_id) # Always begin selection with the original model ID
        query = query.send(scope) # Appends selection from scope
        query = query.select(["#{table_name}.created_at", "#{table_name}.updated_at"]) # Include Rails' timestamps in view
        query = query.select("CAST('#{model_name}' AS char(#{model_name.length})) AS listable_type") # Finish with the original model name, needed for the polymorphic relation

        queries << query
      end
      ActiveRecord::Base.connection.create_view view_name, queries
    end
  end
end

.drop_viewsObject



49
50
51
52
53
# File 'lib/listable/view_manager.rb', line 49

def drop_views
  ActiveRecord::Base.connection.views.each do |name|
    ActiveRecord::Base.connection.drop_view(name) if listable_view? name
  end
end

.listable_view?(name) ⇒ Boolean

Returns:

  • (Boolean)


23
24
25
# File 'lib/listable/view_manager.rb', line 23

def listable_view?(name)
  name.start_with? prefix
end

.listablesObject



13
14
15
# File 'lib/listable/view_manager.rb', line 13

def listables
  @@listables
end

.prefixObject



9
10
11
# File 'lib/listable/view_manager.rb', line 9

def prefix
  'lstble_'  
end

.prefixed_view_name(name) ⇒ Object



5
6
7
# File 'lib/listable/view_manager.rb', line 5

def prefixed_view_name(name)
  prefix << name.underscore.pluralize
end