Method: Spider::Model::IdentityMapper#get

Defined in:
lib/spiderfw/model/identity_mapper.rb

#get(model, values = nil, set_loaded = false) ⇒ Object

Get an instance of model with given values. Values must contain all of model’s primary keys. If an object with the same primary keys is found, it will be used; otherwise, a new instance will be created. In any case, the given values will be set on the object, before it is returned.


FIXME: refactor avoiding set_loaded



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/spiderfw/model/identity_mapper.rb', line 33

def get(model, values=nil, set_loaded=false)
    
    if !values && model.is_a?(BaseModel)
        curr = has?(model)
        return curr ? curr : put(model)
    end
    
    @objects[model] ||= {}
    pks = {}
    has_pks = false
    model.primary_keys.each do |k| 
        # dereference integrated primary keys
        v = (k.integrated? && values[k.integrated_from.name]) ? 
            values[k.integrated_from.name].get(k.integrated_from_element) :
            values[k.name]
        has_pks = true if v
        pks[k.name] = model.prepare_value(k, v)
    end
    orig_pks = pks.clone
    normalize_pks(model, pks)
    unless has_pks
        raise IdentityMapperException, "Can't get #{model} from IdentityMapper without all primary keys, #{values.inspect} given"
    end
    pks.extend(HashComparison)
    current = @objects[model][pks]
    obj = nil
    if current
        obj = current
    else
#                Spider.logger.debug("GETTING NEW #{model} FROM #{pks.inspect}")
        obj = model.new(orig_pks)
        #@objects[model][pks] = obj
    end
    # obj = (@objects[model][pks] ||= model.new(pks))
    pks.each{ |k, v| obj.element_loaded(k) }
    values.reject{|k,v| model.elements[k].primary_key? }.each do |k, v|
        v = get(v) if v.is_a?(BaseModel)
        if set_loaded
            obj.set_loaded_value(k, v)
        else
            obj.set(k, v)
        end
    end
#            Spider::Logger.debug("RETURNING #{obj.class} #{obj.object_id}")
    return obj
end