Module: ActiveRecord::Core::ClassMethods

Defined in:
activerecord/lib/active_record/core.rb

Instance Method Summary collapse

Instance Method Details

#===(object) ⇒ Object

Override the default class equality method to provide support for decorated models.


374
375
376
# File 'activerecord/lib/active_record/core.rb', line 374

def ===(object) # :nodoc:
  object.is_a?(self)
end

#arel_tableObject

Returns an instance of Arel::Table loaded with the current table name.


379
380
381
# File 'activerecord/lib/active_record/core.rb', line 379

def arel_table # :nodoc:
  @arel_table ||= Arel::Table.new(table_name, klass: self)
end

#cached_find_by_statement(key, &block) ⇒ Object

:nodoc:


391
392
393
394
# File 'activerecord/lib/active_record/core.rb', line 391

def cached_find_by_statement(key, &block) # :nodoc:
  cache = @find_by_statement_cache[connection.prepared_statements]
  cache.compute_if_absent(key) { StatementCache.create(connection, &block) }
end

#filter_attributesObject

Returns columns which shouldn't be exposed while calling #inspect.


332
333
334
335
336
337
338
# File 'activerecord/lib/active_record/core.rb', line 332

def filter_attributes
  if defined?(@filter_attributes)
    @filter_attributes
  else
    superclass.filter_attributes
  end
end

#filter_attributes=(filter_attributes) ⇒ Object

Specifies columns which shouldn't be exposed while calling #inspect.


341
342
343
344
# File 'activerecord/lib/active_record/core.rb', line 341

def filter_attributes=(filter_attributes)
  @inspection_filter = nil
  @filter_attributes = filter_attributes
end

#find(*ids) ⇒ Object

:nodoc:


243
244
245
246
247
248
249
250
251
252
253
254
# File 'activerecord/lib/active_record/core.rb', line 243

def find(*ids) # :nodoc:
  # We don't have cache keys for this stuff yet
  return super unless ids.length == 1
  return super if block_given? || primary_key.nil? || scope_attributes?

  id = ids.first

  return super if StatementCache.unsupported_value?(id)

  cached_find_by([primary_key], [id]) ||
    raise(RecordNotFound.new("Couldn't find #{name} with '#{primary_key}'=#{id}", name, primary_key, id))
end

#find_by(*args) ⇒ Object

:nodoc:


256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
# File 'activerecord/lib/active_record/core.rb', line 256

def find_by(*args) # :nodoc:
  return super if scope_attributes?

  hash = args.first
  return super unless Hash === hash

  hash = hash.each_with_object({}) do |(key, value), h|
    key = key.to_s
    key = attribute_aliases[key] || key

    return super if reflect_on_aggregation(key)

    reflection = _reflect_on_association(key)

    if !reflection
      value = value.id if value.respond_to?(:id)
    elsif reflection.belongs_to? && !reflection.polymorphic?
      key = reflection.join_foreign_key
      pkey = reflection.join_primary_key
      value = value.public_send(pkey) if value.respond_to?(pkey)
    end

    if !columns_hash.key?(key) || StatementCache.unsupported_value?(value)
      return super
    end

    h[key] = value
  end

  cached_find_by(hash.keys, hash.values)
end

#find_by!(*args) ⇒ Object

:nodoc:


288
289
290
# File 'activerecord/lib/active_record/core.rb', line 288

def find_by!(*args) # :nodoc:
  find_by(*args) || where(*args).raise_record_not_found_exception!
end

#generated_association_methodsObject

:nodoc:


321
322
323
324
325
326
327
328
329
# File 'activerecord/lib/active_record/core.rb', line 321

def generated_association_methods # :nodoc:
  @generated_association_methods ||= begin
    mod = const_set(:GeneratedAssociationMethods, Module.new)
    private_constant :GeneratedAssociationMethods
    include mod

    mod
  end
end

#inherited(child_class) ⇒ Object

:nodoc:


230
231
232
233
234
235
236
237
238
239
240
241
# File 'activerecord/lib/active_record/core.rb', line 230

def inherited(child_class) # :nodoc:
  # initialize cache at class definition for thread safety
  child_class.initialize_find_by_cache
  unless child_class.base_class?
    klass = self
    until klass.base_class?
      klass.initialize_find_by_cache
      klass = klass.superclass
    end
  end
  super
end

#initialize_find_by_cacheObject

:nodoc:


226
227
228
# File 'activerecord/lib/active_record/core.rb', line 226

def initialize_find_by_cache # :nodoc:
  @find_by_statement_cache = { true => Concurrent::Map.new, false => Concurrent::Map.new }
end

#initialize_generated_modulesObject

:nodoc:


317
318
319
# File 'activerecord/lib/active_record/core.rb', line 317

def initialize_generated_modules # :nodoc:
  generated_association_methods
end

#inspectObject

Returns a string like 'Post(id:integer, title:string, body:text)'


358
359
360
361
362
363
364
365
366
367
368
369
370
371
# File 'activerecord/lib/active_record/core.rb', line 358

def inspect # :nodoc:
  if self == Base
    super
  elsif abstract_class?
    "#{super}(abstract)"
  elsif !connected?
    "#{super} (call '#{super}.connection' to establish a connection)"
  elsif table_exists?
    attr_list = attribute_types.map { |name, type| "#{name}: #{type.type}" } * ", "
    "#{super}(#{attr_list})"
  else
    "#{super}(Table doesn't exist)"
  end
end

#inspection_filterObject

:nodoc:


346
347
348
349
350
351
352
353
354
355
# File 'activerecord/lib/active_record/core.rb', line 346

def inspection_filter # :nodoc:
  if defined?(@filter_attributes)
    @inspection_filter ||= begin
      mask = InspectionMask.new(ActiveSupport::ParameterFilter::FILTERED)
      ActiveSupport::ParameterFilter.new(@filter_attributes, mask: mask)
    end
  else
    superclass.inspection_filter
  end
end

#predicate_builderObject

:nodoc:


383
384
385
# File 'activerecord/lib/active_record/core.rb', line 383

def predicate_builder # :nodoc:
  @predicate_builder ||= PredicateBuilder.new()
end

#type_casterObject

:nodoc:


387
388
389
# File 'activerecord/lib/active_record/core.rb', line 387

def type_caster # :nodoc:
  TypeCaster::Map.new(self)
end