Sha256: 7ce3b9fecab5b69b56917bd744d38bc7826df89513b33c0e82571a474272b892

Contents?: true

Size: 1.89 KB

Versions: 15

Compression:

Stored size: 1.89 KB

Contents

module ActiveFedora::Associations::Builder
  class Orders < ActiveFedora::Associations::Builder::CollectionAssociation
    include ActiveFedora::AutosaveAssociation::AssociationBuilderExtension
    def self.macro
      :orders
    end

    def self.valid_options(options)
      super + [:through, :unordered_reflection]
    end

    def self.define_readers(mixin, name)
      super
      mixin.redefine_method(target_accessor(name)) do
        association(name).target_reader
      end
      mixin.redefine_method("#{target_accessor(name)}=") do |nodes|
        association(name).target_writer(nodes)
      end
    end

    def self.build(model, name, options)
      options = { unordered_reflection: unordered_reflection(model, name) }.merge(options)
      name = :"ordered_#{name.to_s.singularize}_proxies"
      model.property :head, predicate: ::RDF::Vocab::IANA['first']
      model.property :tail, predicate: ::RDF::Vocab::IANA.last
      model.send(:define_method, :apply_first_and_last) do
        source = send(options[:through])
        source.save
        return if head.map(&:rdf_subject) == source.head_id && tail.map(&:rdf_subject) == source.tail_id
        self.head = source.head_id
        self.tail = source.tail_id
        save! if changed?
      end
      model.include ActiveFedora::Associations::Builder::Orders::FixFirstLast
      super
    end

    module FixFirstLast
      def save(*args)
        super.tap do |result|
          apply_first_and_last if result
        end
      end

      def save!(*args)
        super.tap do |result|
          apply_first_and_last if result
        end
      end
    end

    def self.target_accessor(name)
      name.to_s.gsub("_proxies", "").pluralize
    end
    private_class_method :target_accessor

    def self.unordered_reflection(model, original_name)
      model._reflect_on_association(original_name)
    end
    private_class_method :unordered_reflection
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
active-fedora-10.3.0 lib/active_fedora/associations/builder/orders.rb
active-fedora-10.3.0.rc2 lib/active_fedora/associations/builder/orders.rb
active-fedora-10.3.0.rc1 lib/active_fedora/associations/builder/orders.rb
active-fedora-10.2.1 lib/active_fedora/associations/builder/orders.rb
active-fedora-10.2.0 lib/active_fedora/associations/builder/orders.rb
active-fedora-10.1.0 lib/active_fedora/associations/builder/orders.rb
active-fedora-10.1.0.rc1 lib/active_fedora/associations/builder/orders.rb
active-fedora-10.0.0 lib/active_fedora/associations/builder/orders.rb
active-fedora-10.0.0.beta4 lib/active_fedora/associations/builder/orders.rb
active-fedora-10.0.0.beta3 lib/active_fedora/associations/builder/orders.rb
active-fedora-10.0.0.beta2 lib/active_fedora/associations/builder/orders.rb
active-fedora-10.0.0.beta1 lib/active_fedora/associations/builder/orders.rb
active-fedora-9.13.0 lib/active_fedora/associations/builder/orders.rb
active-fedora-9.12.0 lib/active_fedora/associations/builder/orders.rb
active-fedora-9.11.0 lib/active_fedora/associations/builder/orders.rb