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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
# File 'lib/believer/relation.rb', line 38
def has_a_relation(name, opts = {})
defaults = {
}
options = defaults.merge(opts)
get_relation_class = lambda do
if options[:relation_class].nil?
relation_class = options[:class]
if relation_class.nil?
cn = name.to_s.camelize
if options[:type] == :one_2_many
cn = cn[0, (name.to_s.size - 1)]
end
relation_class = Kernel.const_get(cn)
elsif relation_class.is_a?(String)
relation_class = relation_class.split('::').inject(Kernel) { |scope, const_name| scope.const_get(const_name) }
end
options[:relation_class] = relation_class
end
options[:relation_class]
end
cql_record_relations[name] = options
opts[:foreign_key] = opts[:foreign_key].is_a?(Array) ? opts[:foreign_key] : [opts[:foreign_key]]
opts[:key] = opts[:key].is_a?(Array) ? opts[:key] : [opts[:key]]
raise "key and foreign_key must have same number of items" if opts[:key].size != opts[:foreign_key].size
self.redefine_method(name) do |reload = false|
relation_class = get_relation_class.call
q = relation_class.scoped
opts[:foreign_key].each_with_index do |fk, index|
key = opts[:key][index]
q = q.where(fk => self.send(key))
end
if options[:filter]
q = self.instance_exec(q, &(options[:filter]))
unless q
er = EmptyResult.new(:record_class => relation_class)
er.extend(CollectionMethods)
er.extend(::Believer::FinderMethods)
return er
end
end
return q.first if options[:type] == :one_2_one
col = Collection.new(q.query_attributes)
col.to_a if reload
col
end
end
|