class Cordage::Adapters::ActiveRecord::Association::Proxy

Public Class Methods

new( model_klass, association_name, associated_klass_instance, options = {} ) click to toggle source
# File lib/cordage/adapters/active_record/association.rb, line 11
def initialize( model_klass, association_name, associated_klass_instance, options = {} )
  @model_klass               = model_klass
  @association_name          = association_name
  @associated_klass_instance = associated_klass_instance
  @relation_namespace        = options[:relation_namespace]      || "info:fedora/fedora-system:def/relations-external#"
  @fedora_namespace          = options[:fedora_namespace]        || @relation_namespace.split('/').first
  @relation_property         = options[:relation_property]       || "has_#{@association_name}"
  @association_primary_key   = options[:primary_key] || @model_klass.primary_key.to_sym
  ActiveFedora::Predicates.predicate_mappings[@relation_namespace][@relation_property.to_sym] = @relation_property.camelize(:lower)
end

Public Instance Methods

<<( new_models ) click to toggle source
# File lib/cordage/adapters/active_record/association.rb, line 22
def << ( new_models )
  models
  [new_models].flatten.each do |model|
    unless model.instance_of? @model_klass
      raise ::ActiveRecord::AssociationTypeMismatch.new("#{@model_klass.to_s}(#{@model_klass.object_id}) expected, got #{model.class.to_s}(#{model.class.object_id})")
    end
    @associated_klass_instance.add_relationship(@relation_property.to_sym,  RDF::Literal.new(id_to_pid(model)))
    @models << model unless model.in?(@models)
  end
end
clear() click to toggle source
# File lib/cordage/adapters/active_record/association.rb, line 38
def clear
  @associated_klass_instance.clear_relationship @relation_property.to_sym
  @models = []
end
delete( model ) click to toggle source
# File lib/cordage/adapters/active_record/association.rb, line 33
def delete( model )
  @models.delete(model)
  @associated_klass_instance.remove_relationship(@relation_property.to_sym, id_to_pid(model))
end
method_missing(name, *args, &block) click to toggle source
# File lib/cordage/adapters/active_record/association.rb, line 48
def method_missing(name, *args, &block)
  models.send(name, *args, &block)
end
reload() click to toggle source
# File lib/cordage/adapters/active_record/association.rb, line 43
def reload
  clear
  models
end

Private Instance Methods

find_models() click to toggle source
# File lib/cordage/adapters/active_record/association.rb, line 62
def find_models
  ids = @associated_klass_instance.relationships(@relation_property.to_sym).map{|property| property.to_s.split('/').last }
  ids.empty? ? [] : @model_klass.where(@association_primary_key.to_sym =>[ids] ).to_a
end
id_to_pid( model ) click to toggle source
# File lib/cordage/adapters/active_record/association.rb, line 54
def id_to_pid( model )
  "#{@fedora_namespace}/#{model.send(@association_primary_key)}"
end
models() click to toggle source
# File lib/cordage/adapters/active_record/association.rb, line 58
def models
  @models ||= find_models
end