Class: AssociationAccessors::CollectionAssociation

Inherits:
Object
  • Object
show all
Defined in:
lib/association_accessors/collection_association.rb

Class Method Summary collapse

Class Method Details

.define_association_methods(mixin, reflection, attribute) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/association_accessors/collection_association.rb', line 3

def self.define_association_methods mixin, reflection, attribute
  association = reflection.name
  method_name = "#{association.to_s.singularize}_#{attribute.to_s.pluralize}"

  raise_not_found_parameter_count = ActiveRecord::Relation.instance_method(:raise_record_not_found_exception!).parameters.size
  raise_not_found_parameters = %W[
    values.map(&:inspect)
    records.size
    values.size
    :#{attribute}
    not_found_values.map(&:inspect)
  ][0...raise_not_found_parameter_count]

  mixin.class_eval "    def \#{method_name}\n      \#{association}.map &:\#{attribute}\n    end\n\n    def \#{method_name}= values\n      association_class = association(\#{association.inspect}).klass\n      values = Array(values).reject &:blank?\n      records = association_class.where(\#{attribute}: values).index_by(&:\#{attribute}).values_at(*values).compact\n      if records.size == values.size\n        send :\#{association}=, records\n      else\n        not_found_values = values - records.map(&:\#{attribute})\n        association_class.all.raise_record_not_found_exception! \#{raise_not_found_parameters.join ', '}\n      end\n    end\n  CODE\nend\n", __FILE__, __LINE__ + 1