Class: IronAdmin::Adapters::ActiveRecord

Inherits:
Base
  • Object
show all
Defined in:
lib/iron_admin/adapters/active_record.rb

Overview

ActiveRecord adapter — wraps AR's APIs behind the standard adapter interface.

This is the default adapter used by all resources unless overridden. It delegates to ActiveRecord's column introspection, reflection system, query interface, and CRUD operations.

Constant Summary

Constants inherited from Base

Base::TRUTHY_VALUES

Instance Attribute Summary

Attributes inherited from Base

#model_class

Instance Method Summary collapse

Methods inherited from Base

#all, #column_names, #columns, #create_record, #find_by, #find_by_keys, #human_name, #initialize, #primary_key, #resource_name, #table_name, #update_record

Constructor Details

This class inherits a constructor from IronAdmin::Adapters::Base

Instance Method Details

#association(name) ⇒ Object



37
38
39
# File 'lib/iron_admin/adapters/active_record.rb', line 37

def association(name)
  model_class.reflect_on_association(name)
end

#associations(kind = nil) ⇒ Object



29
30
31
32
33
34
35
# File 'lib/iron_admin/adapters/active_record.rb', line 29

def associations(kind = nil)
  if kind
    model_class.reflect_on_all_associations(kind)
  else
    model_class.reflect_on_all_associations
  end
end

#attachmentsObject



41
42
43
44
45
# File 'lib/iron_admin/adapters/active_record.rb', line 41

def attachments
  return {} unless model_class.respond_to?(:attachment_reflections)

  model_class.attachment_reflections
end

#build(attrs = {}) ⇒ Object

--- CRUD ---



127
128
129
# File 'lib/iron_admin/adapters/active_record.rb', line 127

def build(attrs = {})
  model_class.new(attrs)
end

#cast_boolean(value) ⇒ Object



181
182
183
# File 'lib/iron_admin/adapters/active_record.rb', line 181

def cast_boolean(value)
  ::ActiveModel::Type::Boolean.new.cast(value)
end

#count(scope = nil) ⇒ Object



104
105
106
107
# File 'lib/iron_admin/adapters/active_record.rb', line 104

def count(scope = nil)
  scope ||= all
  scope.count
end

#destroy!(record) ⇒ Object



139
140
141
# File 'lib/iron_admin/adapters/active_record.rb', line 139

def destroy!(record)
  record.destroy!
end

#distinct_values(column) ⇒ Object



96
97
98
# File 'lib/iron_admin/adapters/active_record.rb', line 96

def distinct_values(column)
  model_class.distinct.pluck(column).compact.sort
end

#enumsObject



23
24
25
26
27
# File 'lib/iron_admin/adapters/active_record.rb', line 23

def enums
  return {} unless model_class.respond_to?(:defined_enums)

  model_class.defined_enums
end

#filter(scope, column, value) ⇒ Object



80
81
82
# File 'lib/iron_admin/adapters/active_record.rb', line 80

def filter(scope, column, value)
  scope.where(column => value)
end

#find(id) ⇒ Object



72
73
74
75
76
# File 'lib/iron_admin/adapters/active_record.rb', line 72

def find(id)
  model_class.find(id)
rescue ::ActiveRecord::RecordNotFound => e
  raise IronAdmin::RecordNotFound, e.message
end

#find_each(scope) ⇒ Object

--- Batch ---



157
158
159
# File 'lib/iron_admin/adapters/active_record.rb', line 157

def find_each(scope, &)
  scope.find_each(&)
end

#has_column?(name) ⇒ Boolean

rubocop:disable Naming/PredicatePrefix

Returns:

  • (Boolean)


19
20
21
# File 'lib/iron_admin/adapters/active_record.rb', line 19

def has_column?(name) # rubocop:disable Naming/PredicatePrefix
  model_class.column_names.include?(name.to_s)
end

#limit(scope, max) ⇒ Object



88
89
90
# File 'lib/iron_admin/adapters/active_record.rb', line 88

def limit(scope, max)
  scope.limit(max)
end

#order_by(scope, column, direction) ⇒ Object



84
85
86
# File 'lib/iron_admin/adapters/active_record.rb', line 84

def order_by(scope, column, direction)
  scope.order(column => direction)
end

#pagy_methodObject



177
178
179
# File 'lib/iron_admin/adapters/active_record.rb', line 177

def pagy_method
  :pagy
end

#pluck(scope, column) ⇒ Object



100
101
102
# File 'lib/iron_admin/adapters/active_record.rb', line 100

def pluck(scope, column)
  scope.pluck(column)
end

#polymorphic_inverse_classes(polymorphic_name) ⇒ Object



53
54
55
56
57
58
59
60
61
62
# File 'lib/iron_admin/adapters/active_record.rb', line 53

def polymorphic_inverse_classes(polymorphic_name)
  eager_load_model_paths

  application_record_descendants.filter_map do |klass|
    next if klass.abstract_class?
    next unless klass.base_class == klass

    klass if polymorphic_inverse?(klass, polymorphic_name)
  end
end

#preload(scope, association_names) ⇒ Object



92
93
94
# File 'lib/iron_admin/adapters/active_record.rb', line 92

def preload(scope, association_names)
  scope.includes(*association_names)
end

#query_builder_classObject



173
174
175
# File 'lib/iron_admin/adapters/active_record.rb', line 173

def query_builder_class
  IronAdmin::Filters::ActiveRecordQueryBuilder
end

#record_changes(record) ⇒ Object

--- Adapter-Agnostic Interface ---



163
164
165
# File 'lib/iron_admin/adapters/active_record.rb', line 163

def record_changes(record)
  record.saved_changes
end

#rich_text_attributesObject



47
48
49
50
51
# File 'lib/iron_admin/adapters/active_record.rb', line 47

def rich_text_attributes
  return [] unless model_class.respond_to?(:rich_text_association_names)

  model_class.rich_text_association_names
end

#save(record) ⇒ Object



131
132
133
# File 'lib/iron_admin/adapters/active_record.rb', line 131

def save(record)
  record.save
end

#search_column(scope, column, query) ⇒ Object

--- Search ---



111
112
113
114
115
# File 'lib/iron_admin/adapters/active_record.rb', line 111

def search_column(scope, column, query)
  table = quoted_table_name
  col = connection.quote_column_name(column)
  scope.where("#{table}.#{col} #{like_operator} ? #{like_escape_clause}", "%#{sanitize_like(query)}%")
end

#search_columns(scope, columns, query) ⇒ Object



117
118
119
120
121
122
123
# File 'lib/iron_admin/adapters/active_record.rb', line 117

def search_columns(scope, columns, query)
  table = quoted_table_name
  conditions = columns.map do |col|
    "#{table}.#{connection.quote_column_name(col)} #{like_operator} :q #{like_escape_clause}"
  end
  scope.where(conditions.join(" OR "), q: "%#{sanitize_like(query)}%")
end

#transactionObject

--- Transactions ---



151
152
153
# File 'lib/iron_admin/adapters/active_record.rb', line 151

def transaction(&)
  ::ActiveRecord::Base.transaction(&)
end

#unscope_column(scope, column) ⇒ Object

--- Scope Manipulation ---



145
146
147
# File 'lib/iron_admin/adapters/active_record.rb', line 145

def unscope_column(scope, column)
  scope.unscope(where: column.to_sym)
end

#update(record, attrs) ⇒ Object



135
136
137
# File 'lib/iron_admin/adapters/active_record.rb', line 135

def update(record, attrs)
  record.update(attrs)
end

#wrap_rollbackObject



167
168
169
170
171
# File 'lib/iron_admin/adapters/active_record.rb', line 167

def wrap_rollback
  yield
rescue IronAdmin::Rollback
  raise ::ActiveRecord::Rollback
end