-
Notifications
You must be signed in to change notification settings - Fork 29
/
one_to_one.rb
56 lines (43 loc) · 1.77 KB
/
one_to_one.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
require __DIR__ + 'relationship'
module DataMapper
module Associations
module OneToOne
def one_to_one(name, options = {})
raise ArgumentError, "+name+ should be a Symbol, but was #{name.class}", caller unless Symbol === name
raise ArgumentError, "+options+ should be a Hash, but was #{options.class}", caller unless Hash === options
# TOOD: raise an exception if unknown options are passed in
child_model_name = options[:class_name] || DataMapper::Inflection.classify(name)
parent_model_name = DataMapper::Inflection.demodulize(self.name)
relationships[name] = Relationship.new(
DataMapper::Inflection.underscore(parent_model_name).to_sym,
repository.name,
child_model_name,
nil,
parent_model_name,
nil
)
class_eval <<-EOS, __FILE__, __LINE__
def #{name}
#{name}_association.first
end
def #{name}=(child_resource)
#{name}_association.clear
#{name}_association << child_resource unless child_resource.nil?
end
private
def #{name}_association
@#{name}_association ||= begin
relationship = self.class.relationships[:#{name}]
association = relationship.with_parent(self, Associations::ParentToChildAssociation) do |repository, child_key, parent_key, child_model, parent_resource|
repository.all(child_model, child_key.to_query(parent_key.get(parent_resource)))
end
parent_associations << association
association
end
end
EOS
relationships[name]
end
end # module HasOne
end # module Associations
end # module DataMapper