Module: ActiveRecord::Core::ClassMethods

Defined in:
lib/composite_primary_keys/core.rb

Instance Method Summary collapse

Instance Method Details

#find(*ids) ⇒ Object

:nodoc:



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/composite_primary_keys/core.rb', line 21

def find(*ids) # :nodoc:
  # We don't have cache keys for this stuff yet
  return super unless ids.length == 1
  # Allow symbols to super to maintain compatibility for deprecated finders until Rails 5
  return super if ids.first.kind_of?(Symbol)
  return super if block_given? ||
    primary_key.nil? ||
    default_scopes.any? ||
    current_scope ||
    columns_hash.include?(inheritance_column) ||
    ids.first.kind_of?(Array)

  # CPK
  return super if self.composite?

  id  = ids.first
  if ActiveRecord::Base === id
    id = id.id
    ActiveSupport::Deprecation.warn(<<-MSG.squish)
      You are passing an instance of ActiveRecord::Base to `find`.
      Please pass the id of the object by calling `.id`
    MSG
  end
  key = primary_key

  s = find_by_statement_cache[key] || find_by_statement_cache.synchronize {
    find_by_statement_cache[key] ||= StatementCache.create(connection) { |params|
      where(key => params.bind).limit(1)
    }
  }
  record = s.execute([id], self, connection).first
  unless record
    raise RecordNotFound, "Couldn't find #{name} with '#{primary_key}'=#{id}"
  end
  record
rescue RangeError
  raise RecordNotFound, "Couldn't find #{name} with an out of range value for '#{primary_key}'"
end