Class: NestedRecord::NestedAccessorsSetup

Inherits:
Object
  • Object
show all
Defined in:
lib/nested_record/nested_accessors_setup.rb

Instance Method Summary collapse

Constructor Details

#initialize(owner, name, class_name: false, default: {}, &block) ⇒ NestedAccessorsSetup

Returns a new instance of NestedAccessorsSetup.

Raises:

  • (ArgumentError)


2
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
34
35
36
37
38
39
40
41
42
43
# File 'lib/nested_record/nested_accessors_setup.rb', line 2

def initialize(owner, name, class_name: false, default: {}, &block)
  raise ArgumentError, 'block is required for .nested_accessors_in' unless block

  recorder = NestedRecord::MacroRecorder.new
  recorder.instance_eval(&block)

  @has_one_setup = owner.has_one_nested(name, class_name: class_name, default: default, attributes_writer: { strategy: :rewrite }) do
    recorder.apply_to(self)
  end

  @extension = Module.new

  macros = [
    recorder,
    *recorder.macros.select do |macro, args, _|
      macro == :include && args.first.is_a?(NestedRecord::Concern)
    end.map! { |_, args, _| args.first.macro_recorder }
  ].flat_map(&:macros)

  macros.each do |macro, args, _block|
    case macro
    when :attribute
      attr_name = args.first
      delegate(attr_name)
      delegate("#{attr_name}?")
      delegate1("#{attr_name}=")
    when :has_one_nested
      assoc_name = args.first
      delegate(assoc_name)
      delegate("#{assoc_name}!")
      delegate1("#{assoc_name}=")
      delegate1("#{assoc_name}_attributes=")
    when :has_many_nested
      assoc_name = args.first
      delegate(assoc_name)
      delegate1("#{assoc_name}=")
      delegate1("#{assoc_name}_attributes=")
    end
  end

  owner.include(@extension)
end

Instance Method Details

#nameObject



45
46
47
# File 'lib/nested_record/nested_accessors_setup.rb', line 45

def name
  @has_one_setup.name
end