Class: ActiveRecord::Associations::Preloader::Association

Inherits:
Object
  • Object
show all
Defined in:
lib/composite_primary_keys/associations/preloader/association.rb

Instance Method Summary collapse

Instance Method Details

#owners_by_keyObject



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/composite_primary_keys/associations/preloader/association.rb', line 17

def owners_by_key
  unless defined?(@owners_by_key)
    @owners_by_key = owners.each_with_object({}) do |owner, h|
      # CPK
      #key = convert_key(owner[owner_key_name])
      key = if owner_key_name.is_a?(Array)
              Array(owner_key_name).map do |key_name|
                convert_key(owner[key_name])
              end
            else
              convert_key(owner[owner_key_name])
            end

      h[key] = owner if key
    end
  end
  @owners_by_key
end

#records_for(ids, &block) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
# File 'lib/composite_primary_keys/associations/preloader/association.rb', line 5

def records_for(ids, &block)
  # CPK
  #scope.where(association_key_name => ids).load(&block)

  if association_key_name.is_a?(Array)
    predicate = cpk_in_predicate(klass.arel_table, association_key_name, ids)
    scope.where(predicate).load(&block)
  else
    scope.where(association_key_name => ids).load(&block)
  end
end

#run(preloader) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/composite_primary_keys/associations/preloader/association.rb', line 36

def run(preloader)
  records = load_records do |record|
    # CPK
    #owner = owners_by_key[convert_key(record[association_key_name])]

    key = if association_key_name.is_a?(Array)
            Array(record[association_key_name]).map do |key|
              convert_key(key)
            end
          else
            convert_key(record[association_key_name])
          end

    owner = owners_by_key[key]
    association = owner.association(reflection.name)
    association.set_inverse_instance(record)
  end

  owners.each do |owner|
    associate_records_to_owner(owner, records[convert_key(owner[owner_key_name])] || [])
  end
end