occams-record 0.12.0 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/occams-record/merge.rb +40 -4
- data/lib/occams-record/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 64aef087892a4022dbfe3d6cdd225a7c00a5e32c44ff34473736d464ba6d62f4
|
4
|
+
data.tar.gz: 7f3f8120d97ea431b41ef26e699410413cba4dc23ec6f88f0d64da497b9c6904
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3e723f610281672d0f050feceb95d2037f21d82b799a254711c0fc756fd6c1582027a5796674a63a968155118fe7746abcbd26995311544be3ee5842c0a0b113
|
7
|
+
data.tar.gz: 1f9ccbf33361d7e81b79552aaf75876c02c02f9144bf1476e7bb4e71f68ab472009219d9fc86322921b0fa8489492b4a4458d2cca51be64284e6ead5178e0190
|
data/lib/occams-record/merge.rb
CHANGED
@@ -9,6 +9,25 @@ module OccamsRecord
|
|
9
9
|
# @return [Array<OccamsRecord::Results::Row>] the rows into which associated rows will be merged
|
10
10
|
attr_reader :target_rows
|
11
11
|
|
12
|
+
# Exception raised when a foreign or primary key is missing from a record
|
13
|
+
class MissingFieldError < StandardError
|
14
|
+
# @return [OccamsRecord::Result::Row]
|
15
|
+
attr_reader :record
|
16
|
+
# @return [Symbol]
|
17
|
+
attr_reader :field
|
18
|
+
|
19
|
+
# @param record [OccamsRecord::Result::Row]
|
20
|
+
# @param field [Symbol]
|
21
|
+
def initialize(record, field)
|
22
|
+
@record, @field = record, field
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [String]
|
26
|
+
def message
|
27
|
+
"Missing field '#{field}' on #{record.inspect}. Did you forget to select it?"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
12
31
|
#
|
13
32
|
# Initialize a new Merge operation.
|
14
33
|
#
|
@@ -30,13 +49,21 @@ module OccamsRecord
|
|
30
49
|
#
|
31
50
|
def single!(assoc_rows, target_attr, assoc_attr)
|
32
51
|
assoc_rows_by_id = assoc_rows.reduce({}) { |a, assoc_row|
|
33
|
-
|
52
|
+
begin
|
53
|
+
id = assoc_row.send assoc_attr
|
54
|
+
rescue NoMethodError => e
|
55
|
+
raise MissingFieldError.new(assoc_row, e.name)
|
56
|
+
end
|
34
57
|
a[id] = assoc_row
|
35
58
|
a
|
36
59
|
}
|
37
60
|
|
38
61
|
target_rows.each do |row|
|
39
|
-
|
62
|
+
begin
|
63
|
+
attr = row.send target_attr
|
64
|
+
rescue NoMethodError => e
|
65
|
+
raise MissingFieldError.new(row, e.name)
|
66
|
+
end
|
40
67
|
row.send @assign, attr ? assoc_rows_by_id[attr] : nil
|
41
68
|
end
|
42
69
|
end
|
@@ -47,9 +74,18 @@ module OccamsRecord
|
|
47
74
|
# target_attr and assoc_attr are the matching keys on target_rows and assoc_rows, respectively.
|
48
75
|
#
|
49
76
|
def many!(assoc_rows, target_attr, assoc_attr)
|
50
|
-
|
77
|
+
begin
|
78
|
+
assoc_rows_by_attr = assoc_rows.group_by(&assoc_attr.to_sym)
|
79
|
+
rescue NoMethodError => e
|
80
|
+
raise MissingFieldError.new(assoc_rows_by_attr[0], e.name)
|
81
|
+
end
|
82
|
+
|
51
83
|
target_rows.each do |row|
|
52
|
-
|
84
|
+
begin
|
85
|
+
pkey = row.send target_attr
|
86
|
+
rescue NoMethodError => e
|
87
|
+
raise MissingFieldError.new(row, e.name)
|
88
|
+
end
|
53
89
|
row.send @assign, assoc_rows_by_attr[pkey] || []
|
54
90
|
end
|
55
91
|
end
|