Class: ActiveRecord::Associations::HasManyThroughAssociation

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

Instance Method Summary collapse

Instance Method Details

#construct_join_attributes(*records) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/composite_primary_keys/associations/has_many_through_association.rb', line 29

def construct_join_attributes(*records)
  # CPK
  if !self.source_reflection.polymorphic? && source_reflection.klass.composite?
    ensure_mutable

    ids = records.map do |record|
      source_reflection.association_primary_key(reflection.klass).map do |key|
        record.send(key)
      end
    end

    cpk_in_predicate(through_association.scope.klass.arel_table, source_reflection.foreign_key, ids)
  else
    original_construct_join_attributes(*records)
  end
end

#original_construct_join_attributesObject



27
# File 'lib/composite_primary_keys/associations/has_many_through_association.rb', line 27

alias :original_construct_join_attributes :construct_join_attributes

#through_records_for(record) ⇒ Object



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/composite_primary_keys/associations/has_many_through_association.rb', line 4

def through_records_for(record)
  # CPK
  # attributes = construct_join_attributes(record)
  # candidates = Array.wrap(through_association.target)
  # candidates.find_all do |c|
  #   attributes.all? do |key, value|
  #     c.public_send(key) == value
  #   end
  # end
  if record.composite?
    candidates = Array.wrap(through_association.target)
    candidates.find_all { |c| c.attributes.slice(*source_reflection.association_primary_key) == record.ids_hash }
  else
    attributes = construct_join_attributes(record)
    candidates = Array.wrap(through_association.target)
    candidates.find_all do |c|
      attributes.all? do |key, value|
        c.public_send(key) == value
      end
    end
  end
end