Module: ActiveRecord::Core::ClassMethods

Defined in:
lib/active_record/core.rb

Instance Method Summary collapse

Instance Method Details

#===(object) ⇒ Object

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



415
416
417
# File 'lib/active_record/core.rb', line 415

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

#arel_tableObject

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



420
421
422
# File 'lib/active_record/core.rb', line 420

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

#cached_find_by_statement(key, &block) ⇒ Object

:nodoc:



432
433
434
435
# File 'lib/active_record/core.rb', line 432

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.



373
374
375
376
377
378
379
# File 'lib/active_record/core.rb', line 373

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.



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

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

#find(*ids) ⇒ Object

:nodoc:



268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
# File 'lib/active_record/core.rb', line 268

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)

  key = primary_key

  statement = cached_find_by_statement(key) { |params|
    where(key => params.bind).limit(1)
  }

  statement.execute([id], connection).first ||
    raise(RecordNotFound.new("Couldn't find #{name} with '#{key}'=#{id}", name, key, id))
end

#find_by(*args) ⇒ Object

:nodoc:



287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
# File 'lib/active_record/core.rb', line 287

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

  keys = hash.keys
  statement = cached_find_by_statement(keys) { |params|
    wheres = keys.index_with { params.bind }
    where(wheres).limit(1)
  }

  begin
    statement.execute(hash.values, connection).first
  rescue TypeError
    raise ActiveRecord::StatementInvalid
  end
end

#find_by!(*args) ⇒ Object

:nodoc:



329
330
331
# File 'lib/active_record/core.rb', line 329

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

#generated_association_methodsObject

:nodoc:



362
363
364
365
366
367
368
369
370
# File 'lib/active_record/core.rb', line 362

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:



255
256
257
258
259
260
261
262
263
264
265
266
# File 'lib/active_record/core.rb', line 255

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:



251
252
253
# File 'lib/active_record/core.rb', line 251

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

#initialize_generated_modulesObject

:nodoc:



358
359
360
# File 'lib/active_record/core.rb', line 358

def initialize_generated_modules # :nodoc:
  generated_association_methods
end

#inspectObject

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



399
400
401
402
403
404
405
406
407
408
409
410
411
412
# File 'lib/active_record/core.rb', line 399

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:



387
388
389
390
391
392
393
394
395
396
# File 'lib/active_record/core.rb', line 387

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:



424
425
426
# File 'lib/active_record/core.rb', line 424

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

#type_casterObject

:nodoc:



428
429
430
# File 'lib/active_record/core.rb', line 428

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