Class: ReactiveResource::Association::HasOneAssociation

Inherits:
Object
  • Object
show all
Defined in:
lib/reactive_resource/association/has_one_association.rb

Overview

Represents and resolves a has_one association

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(klass, attribute, options) ⇒ HasOneAssociation

Create a new has_one association.



53
54
55
56
57
58
59
# File 'lib/reactive_resource/association/has_one_association.rb', line 53

def initialize(klass, attribute, options)
  @klass = klass
  @attribute = attribute
  @options = options

  add_helper_methods(klass, attribute)
end

Instance Attribute Details

#attributeObject (readonly)

The attribute name this association represents



10
11
12
# File 'lib/reactive_resource/association/has_one_association.rb', line 10

def attribute
  @attribute
end

#klassObject (readonly)

The class this association is attached to



7
8
9
# File 'lib/reactive_resource/association/has_one_association.rb', line 7

def klass
  @klass
end

#optionsObject (readonly)

additional options passed in when the association was created



13
14
15
# File 'lib/reactive_resource/association/has_one_association.rb', line 13

def options
  @options
end

Instance Method Details

#add_helper_methods(klass, attribute) ⇒ Object

Adds methods for has_one associations, to make dealing with these objects a bit more straightforward. If the attribute name is headshot, it will add:

headshot

returns the associated headshot



38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/reactive_resource/association/has_one_association.rb', line 38

def add_helper_methods(klass, attribute)
  association = self
  klass.class_eval do 
    # lawyer.headshot
    define_method(attribute) do
      unless instance_variable_get("@#{attribute}")
        object = association.resolve_relationship(self)
        instance_variable_set("@#{attribute}", object)
      end
      instance_variable_get("@#{attribute}")
    end
  end
end

#associated_classObject

Returns the class name of the target of the association. Based off of attribute unless class_name was passed in the options hash.



18
19
20
21
22
23
24
# File 'lib/reactive_resource/association/has_one_association.rb', line 18

def associated_class
  if options[:class_name]
    options[:class_name].constantize
  else
    klass.relative_const_get(attribute.to_s.camelize)
  end
end

#resolve_relationship(object) ⇒ Object

Called when this assocation is referenced. Finds and returns the target of this association.



28
29
30
31
# File 'lib/reactive_resource/association/has_one_association.rb', line 28

def resolve_relationship(object)
  id_attribute = "#{klass.name.split("::").last.underscore}_id"
  associated_class.find(:one, :params => object.prefix_options.merge(id_attribute => object.id))
end