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.



348
349
350
# File 'activerecord/lib/active_record/core.rb', line 348

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

#arel_tableObject

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



353
354
355
# File 'activerecord/lib/active_record/core.rb', line 353

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

#cached_find_by_statement(key, &block) ⇒ Object

:nodoc:



365
366
367
368
# File 'activerecord/lib/active_record/core.rb', line 365

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.



306
307
308
309
310
311
312
# File 'activerecord/lib/active_record/core.rb', line 306

def filter_attributes
  if @filter_attributes.nil?
    superclass.filter_attributes
  else
    @filter_attributes
  end
end

#filter_attributes=(filter_attributes) ⇒ Object

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



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

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

#find(*ids) ⇒ Object

:nodoc:



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

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:



255
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
# File 'activerecord/lib/active_record/core.rb', line 255

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:



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

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

#generated_association_methodsObject

:nodoc:



295
296
297
298
299
300
301
302
303
# File 'activerecord/lib/active_record/core.rb', line 295

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

    mod
  end
end

#initialize_find_by_cacheObject

:nodoc:



238
239
240
# File 'activerecord/lib/active_record/core.rb', line 238

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

#initialize_generated_modulesObject

:nodoc:



291
292
293
# File 'activerecord/lib/active_record/core.rb', line 291

def initialize_generated_modules # :nodoc:
  generated_association_methods
end

#inspectObject

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



332
333
334
335
336
337
338
339
340
341
342
343
344
345
# File 'activerecord/lib/active_record/core.rb', line 332

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:



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

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

#predicate_builderObject

:nodoc:



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

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

#type_casterObject

:nodoc:



361
362
363
# File 'activerecord/lib/active_record/core.rb', line 361

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