Class: ActiveFedora::Reflection::AssociationReflection

Inherits:
MacroReflection show all
Defined in:
lib/active_fedora/reflection.rb

Overview

Holds all the meta-data about an association as it was specified in the Active Record class.

Direct Known Subclasses

RDFPropertyReflection

Constant Summary collapse

VALID_AUTOMATIC_INVERSE_MACROS =
[:has_many, :has_and_belongs_to_many, :belongs_to]
INVALID_AUTOMATIC_INVERSE_OPTIONS =
[:conditions, :through, :polymorphic, :foreign_key]

Instance Attribute Summary

Attributes inherited from MacroReflection

#active_fedora, #macro, #name, #options

Instance Method Summary collapse

Methods inherited from MacroReflection

#belongs_to?, #class_name, #collection?, #has_and_belongs_to_many?, #has_many?, #klass

Constructor Details

#initialize(macro, name, options, active_fedora) ⇒ AssociationReflection

:nodoc:



168
169
170
171
# File 'lib/active_fedora/reflection.rb', line 168

def initialize(macro, name, options, active_fedora)
  super
  @collection = [:has_many, :has_and_belongs_to_many].include?(macro)
end

Instance Method Details

#association_classObject



247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
# File 'lib/active_fedora/reflection.rb', line 247

def association_class
  case macro
  when :contains
    Associations::ContainsAssociation
  when :belongs_to
    Associations::BelongsToAssociation
  when :has_and_belongs_to_many
    Associations::HasAndBelongsToManyAssociation
  when :has_many
    Associations::HasManyAssociation
  when :singular_rdf
    Associations::SingularRDF
  when :rdf
    Associations::RDF
  end
end

#build_association(*options) ⇒ Object

Returns a new, unsaved instance of the associated class. options will be passed to the class’s constructor.



176
177
178
# File 'lib/active_fedora/reflection.rb', line 176

def build_association(*options)
  klass.new(*options)
end

#chainObject

A chain of reflections from this one back to the owner. For more see the explanation in ThroughReflection.



217
218
219
# File 'lib/active_fedora/reflection.rb', line 217

def chain
  [self]
end

#check_validity!Object



203
204
205
# File 'lib/active_fedora/reflection.rb', line 203

def check_validity!
  check_validity_of_inverse!
end

#check_validity_of_inverse!Object



207
208
209
210
211
212
213
# File 'lib/active_fedora/reflection.rb', line 207

def check_validity_of_inverse!
  unless options[:polymorphic]
    if has_inverse? && inverse_of.nil?
      raise InverseOfAssociationNotFoundError.new(self)
    end
  end
end

#create_association(*options) ⇒ Object

Creates a new instance of the associated class, and immediately saves it with ActiveFedora::Base#save. options will be passed to the class’s creation method. Returns the newly created object.



183
184
185
# File 'lib/active_fedora/reflection.rb', line 183

def create_association(*options)
  klass.create(*options)
end

#foreign_keyObject



187
188
189
# File 'lib/active_fedora/reflection.rb', line 187

def foreign_key
  @foreign_key ||= options[:foreign_key] || derive_foreign_key
end

#has_inverse?Boolean

Returns:

  • (Boolean)


223
224
225
# File 'lib/active_fedora/reflection.rb', line 223

def has_inverse?
  inverse_name
end

#inverse_ofObject



227
228
229
230
231
# File 'lib/active_fedora/reflection.rb', line 227

def inverse_of
  return unless inverse_name

  @inverse_of ||= klass.reflect_on_association inverse_name
end

#predicateObject

Returns the RDF predicate as defined by the :predicate option



192
193
194
# File 'lib/active_fedora/reflection.rb', line 192

def predicate
  options[:predicate]
end

#solr_keyObject



196
197
198
199
200
201
# File 'lib/active_fedora/reflection.rb', line 196

def solr_key
  @solr_key ||= begin
    predicate_string = predicate.fragment || predicate.to_s.rpartition(/\//).last
    ActiveFedora::SolrQueryBuilder.solr_name(predicate_string, :symbol)
  end
end

#validate?Boolean

Returns whether or not the association should be validated as part of the parent’s validation.

Unless you explicitly disable validation with :validate => false, validation will take place when:

  • you explicitly enable validation; :validate => true

  • you use autosave; :autosave => true

  • the association is a has_many association

Returns:

  • (Boolean)


243
244
245
# File 'lib/active_fedora/reflection.rb', line 243

def validate?
  !options[:validate].nil? ? options[:validate] : (options[:autosave] == true || macro == :has_many)
end