Module: IgnorableColumns::ClassMethods
- Defined in:
- lib/ignorable_columns.rb
Instance Method Summary collapse
-
#column_names ⇒ Object
:nodoc:.
-
#columns ⇒ Object
:nodoc:.
-
#ignore_columns(*cols) ⇒ Object
(also: #ignore_column)
Prevent Rails from loading a table column.
-
#ignore_columns_in_sql ⇒ Object
(also: #ignore_column_in_sql)
Ignore columns for select statements.
-
#ignored_column?(column) ⇒ Boolean
Has a column been ignored? Accepts both ActiveRecord::ConnectionAdapter::Column objects, and actual column names (‘title’).
-
#include_columns? ⇒ Boolean
:nodoc:.
-
#included_columns ⇒ Object
:nodoc:.
-
#including_ignored_columns(*cols) ⇒ Object
Execute block in a scope including all or some of the ignored columns.
- #including_ignored_columns_subclass_name(cols = nil) ⇒ Object
- #reset_ignorable_columns ⇒ Object
Instance Method Details
#column_names ⇒ Object
: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 |
#columns ⇒ Object
: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_sql ⇒ Object 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’)
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:
114 115 116 |
# File 'lib/ignorable_columns.rb', line 114 def include_columns? # :nodoc: @include_columns end |
#included_columns ⇒ Object
: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_columns ⇒ Object
122 123 124 125 |
# File 'lib/ignorable_columns.rb', line 122 def reset_ignorable_columns reset_columns self.default_scopes = orig_default_scopes end |