Module: ActiveRecord::JSONB::Associations::Preloader::HasMany

Defined in:
lib/activerecord/jsonb/associations/preloader/has_many.rb

Overview

:nodoc:

Instance Method Summary collapse

Instance Method Details

#associated_records_by_owner(preloader) ⇒ Object

rubocop:disable Metrics/AbcSize, Metrics/MethodLength



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/activerecord/jsonb/associations/preloader/has_many.rb', line 27

def associated_records_by_owner(preloader)
  return super unless reflection.options.key?(:store)

  records = load_records do |record|
    record[association_key_name].each do |owner_key|
      owner = owners_by_key[convert_key(owner_key)]
      association = owner.association(reflection.name)
      association.set_inverse_instance(record)
    end
  end

  owners.each_with_object({}) do |owner, result|
    result[owner] = records[convert_key(owner[owner_key_name])] || []
  end
end

#association_key_nameObject

rubocop:enable Metrics/AbcSize



20
21
22
23
24
# File 'lib/activerecord/jsonb/associations/preloader/has_many.rb', line 20

def association_key_name
  super_value = super
  return super_value unless reflection.options.key?(:store)
  super_value.pluralize
end

#load_records(&block) ⇒ Object

rubocop:disable Metrics/AbcSize



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/activerecord/jsonb/associations/preloader/has_many.rb', line 45

def load_records(&block)
  return super unless reflection.options.key?(:store)

  return {} if owner_keys.empty?
  @preloaded_records = records_for(owner_keys).load(&block)
  @preloaded_records.each_with_object({}) do |record, result|
    record[association_key_name].each do |owner_key|
      result[convert_key(owner_key)] ||= []
      result[convert_key(owner_key)] << record
    end
  end
end

#records_for(ids) ⇒ Object

rubocop:disable Metrics/AbcSize



7
8
9
10
11
12
13
14
15
16
17
# File 'lib/activerecord/jsonb/associations/preloader/has_many.rb', line 7

def records_for(ids)
  return super unless reflection.options.key?(:store)

  scope.where(
    Arel::Nodes::JSONBHashArrow.new(
      table,
      table[reflection.options[:store]],
      association_key_name.pluralize
    ).intersects_with(ids)
  )
end