occams-record 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|