Skip to content

Instantly share code, notes, and snippets.

@sineed
Created February 28, 2014 08:29

Revisions

  1. sineed created this gist Feb 28, 2014.
    32 changes: 32 additions & 0 deletions nested_attributes_for_strategy.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,32 @@
    class NestedAttributesForStrategy
    def association(runner)
    runner.run
    end

    def result(evaluation)
    evaluation.object.tap do |instance|
    evaluation.notify(:after_build, instance)
    return attributes(instance)
    end
    end

    private

    def attributes(instance)
    attrs = instance.attributes.delete_if do |k, _|
    %w(id type created_at updated_at).include?(k)
    end
    nested_reflections(instance).each do |ref|
    attrs.merge!("#{ref.name}_attributes" => instance.send(ref.name).map do |nested_obj|
    attributes(nested_obj)
    end)
    end
    attrs
    end

    def nested_reflections(instance)
    instance.reflections.values.select do |ref|
    ref.macro == :has_many && instance.respond_to?("#{ref.name}_attributes=")
    end
    end
    end