Module: IgnorableColumns::ClassMethods

Defined in:
lib/ignorable_columns.rb

Instance Method Summary collapse

Instance Method Details

#column_namesObject

:nodoc:



105
106
107
108
109
110
111
112
# File 'lib/ignorable_columns.rb', line 105

def column_names # :nodoc:
  if @all_column_names
    @column_names ||= @all_column_names.reject { |col| ignored_column?(col) }
  else
    @all_column_names = all_columns.map(&:name)
    @column_names = @all_column_names.reject { |col| ignored_column?(col) }
  end
end

#columnsObject

:nodoc:



96
97
98
99
100
101
102
103
# File 'lib/ignorable_columns.rb', line 96

def columns # :nodoc:
  if @all_columns
    @columns ||= super.reject { |col| ignored_column?(col) }
  else
    @all_columns = super
    @columns = super.reject { |col| ignored_column?(col) }
  end
end

#ignore_columns(*cols) ⇒ Object Also known as: ignore_column

Prevent Rails from loading a table column. Useful for legacy database schemas with problematic column names, like ‘class’ or ‘attributes’.

class Topic < ActiveRecord::Base
  ignore_columns :attributes, :class
end

Topic.new.respond_to?(:attributes) => false


33
34
35
36
37
38
39
# File 'lib/ignorable_columns.rb', line 33

def ignore_columns(*cols)
  self.ignorable_columns ||= []
  self.ignorable_columns += (cols || []).map(&:to_s)
  self.ignorable_columns.tap(&:uniq!)
  reset_columns
  columns
end

#ignore_columns_in_sqlObject Also known as: ignore_column_in_sql

Ignore columns for select statements. Useful for optimizing queries that load large amounts of rarely data. Exclude ignored columns from the sql queries. NOTE: should be called after #ignore_columns

class Topic < ActiveRecord::Base
  ignore_columns :attributes, :class
  ignore_columns_in_sql
end


51
52
53
54
55
56
57
# File 'lib/ignorable_columns.rb', line 51

def ignore_columns_in_sql
  (self.default_scopes = orig_default_scopes) && return unless ignorable_columns.present?
  unless default_scopes.include? default_scopes_cache[ignorable_columns]
    default_scopes_cache[ignorable_columns] ||= proc { select(*(all_columns.map(&:name) - ignorable_columns)) }
    self.default_scopes = (default_scopes.clone || []) << default_scopes_cache[ignorable_columns]
  end
end

#ignored_column?(column) ⇒ Boolean

Has a column been ignored? Accepts both ActiveRecord::ConnectionAdapter::Column objects, and actual column names (‘title’)

Returns:

  • (Boolean)


63
64
65
66
67
# File 'lib/ignorable_columns.rb', line 63

def ignored_column?(column)
  self.ignorable_columns.present? && self.ignorable_columns.include?(
    column.respond_to?(:name) ? column.name : column.to_s
  )
end

#include_columns?Boolean

:nodoc:

Returns:

  • (Boolean)


114
115
116
# File 'lib/ignorable_columns.rb', line 114

def include_columns? # :nodoc:
  @include_columns
end

#included_columnsObject

:nodoc:



118
119
120
# File 'lib/ignorable_columns.rb', line 118

def included_columns # :nodoc:
  @included_columns
end

#including_ignored_columns(*cols) ⇒ Object

Execute block in a scope including all or some of the ignored columns. If no arguments are passed all ignored columns will be included, otherwise only the subset passed as argument will be included.

class Topic < ActiveRecord::Base
  ignore_columns :attributes, :class
  ignore_columns_in_sql
end
...
Topic.including_ignored_columns { Topic.last(5).map(&:attributes) }
Topic.including_ignored_columns(:class) { Topic.last(5).map(&:attributes) }


80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/ignorable_columns.rb', line 80

def including_ignored_columns(*cols)
  st_cols = cols.map(&:to_s)
  sy_cols = cols.map(&:to_sym)
  if including_columns_subclass_cache[sy_cols].present?
    return including_columns_subclass_cache[sy_cols]
  else
    subclass_name = including_ignored_columns_subclass_name(st_cols)
    begin
      including_columns_subclass_cache[sy_cols] = Object.const_get(subclass_name)
      return including_columns_subclass_cache[sy_cols]
    rescue NameError
      including_columns_subclass_cache[sy_cols] = generate_subclass_for_ignored_cols(subclass_name, st_cols)
    end
  end
end

#including_ignored_columns_subclass_name(cols = nil) ⇒ Object



127
128
129
130
131
132
133
134
135
# File 'lib/ignorable_columns.rb', line 127

def including_ignored_columns_subclass_name(cols = nil)
  subclass_name = name + 'With'
  subclass_name += if cols.present?
                     cols.sort.map(&:camelcase).join
                   else
                     'All'
                   end
  subclass_name
end

#reset_ignorable_columnsObject



122
123
124
125
# File 'lib/ignorable_columns.rb', line 122

def reset_ignorable_columns
  reset_columns
  self.default_scopes = orig_default_scopes
end