activerecord-archiver 0.1.6 → 0.1.7
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/activerecord-archiver/archiver.rb +22 -5
- data/lib/activerecord-archiver/export.rb +9 -8
- data/lib/activerecord-archiver/import.rb +18 -19
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: deb91c95d7c5e133554018262c2d5bb8ef928126
|
4
|
+
data.tar.gz: d43388d052fef1228384bb2c510c2108b7bc8924
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f15f61ec60073da124467322e4c706641e587e678e1c730e1028f48c390d236fffcfd1ea9e38568f512d24f53df4b7a26b5d4c579e11c6ae963b95805ef80891
|
7
|
+
data.tar.gz: 1b9966bae6b81b0a16ba804aa1e23fc326cdc1fd97b3fdb2b4a8e4db9ebe12bfdd44db52017eeabd3e2682e4dcfffd20af53f241372dccc6a53128cc5a011ee3
|
@@ -25,7 +25,8 @@ class ActiveRecordArchiver
|
|
25
25
|
|
26
26
|
def self.relation_index record, attribute
|
27
27
|
relevant_records = @models_hash[relation_model(record.class, attribute)].first
|
28
|
-
relevant_records.present?
|
28
|
+
relevant_records.present? and
|
29
|
+
relevant_records.compact.map(&:id).index(record.send(attribute).try(:id))
|
29
30
|
end
|
30
31
|
|
31
32
|
def self.relation_id model, key, value
|
@@ -40,8 +41,12 @@ class ActiveRecordArchiver
|
|
40
41
|
def self.insertable_hash model, hash
|
41
42
|
ret = {}
|
42
43
|
hash.each_pair do |key, value|
|
43
|
-
if column(model, key)
|
44
|
-
|
44
|
+
if (col = column(model, key))
|
45
|
+
if col.type == :datetime and value.present?
|
46
|
+
ret[col] = DateTime.parse(value).to_s(:db)
|
47
|
+
else
|
48
|
+
ret[col] = value
|
49
|
+
end
|
45
50
|
elsif belongs_to?(model, key)
|
46
51
|
foreign_key = relation_foreign_key(model, key)
|
47
52
|
if !hash.include?(foreign_key) and column_required(model, foreign_key)
|
@@ -66,8 +71,8 @@ class ActiveRecordArchiver
|
|
66
71
|
end
|
67
72
|
|
68
73
|
def self.assert_instance_of instance, klass
|
69
|
-
unless instance.
|
70
|
-
raise "Object #{instance} is not an instance of the #{klass} model"
|
74
|
+
unless instance.is_a?(klass)
|
75
|
+
raise "Object #{instance.inspect} is not an instance of the #{klass.inspect} model"
|
71
76
|
end
|
72
77
|
end
|
73
78
|
|
@@ -114,4 +119,16 @@ class ActiveRecordArchiver
|
|
114
119
|
end
|
115
120
|
end.compact
|
116
121
|
end
|
122
|
+
|
123
|
+
def self.without_foreign_key_constraints
|
124
|
+
conn = ActiveRecord::Base.connection
|
125
|
+
if (conn.instance_of?(ActiveRecord::ConnectionAdapters::MysqlAdapter) or
|
126
|
+
conn.instance_of?(ActiveRecord::ConnectionAdapters::Mysql2Adapter))
|
127
|
+
conn.execute('SET foreign_key_checks = 0')
|
128
|
+
yield
|
129
|
+
conn.execute('SET foreign_key_checks = 1')
|
130
|
+
else
|
131
|
+
yield
|
132
|
+
end
|
133
|
+
end
|
117
134
|
end
|
@@ -43,11 +43,10 @@ class ActiveRecordArchiver
|
|
43
43
|
result = {}
|
44
44
|
|
45
45
|
# serialize
|
46
|
-
@models_hash.each_pair do |model,
|
47
|
-
|
48
|
-
|
46
|
+
@models_hash.each_pair do |model, (records, attributes)|
|
47
|
+
next unless records.compact.present?
|
49
48
|
result[model.to_s] = []
|
50
|
-
records.each do |record|
|
49
|
+
[*records].each do |record|
|
51
50
|
|
52
51
|
assert_instance_of record, model
|
53
52
|
|
@@ -92,17 +91,19 @@ class ActiveRecordArchiver
|
|
92
91
|
if collection.is_a? ActiveRecord::Base
|
93
92
|
options[[collection]] = options[collection]
|
94
93
|
options.delete(collection)
|
94
|
+
elsif !collection.compact.present?
|
95
|
+
options.delete(collection)
|
95
96
|
end
|
96
97
|
end
|
97
98
|
|
98
|
-
models = options.
|
99
|
-
collection.first.class
|
99
|
+
models = options.keys.map do |collection|
|
100
|
+
collection.first.class.base_class
|
100
101
|
end
|
101
102
|
|
102
103
|
models_hash = {}
|
103
104
|
|
104
105
|
options.each_pair do |collection, cols|
|
105
|
-
models_hash[collection.first.class] =
|
106
|
+
models_hash[collection.first.class.base_class] =
|
106
107
|
[collection,
|
107
108
|
if cols.is_a? Array then cols
|
108
109
|
elsif cols == :all or cols.is_a? Hash
|
@@ -114,4 +115,4 @@ class ActiveRecordArchiver
|
|
114
115
|
|
115
116
|
models_hash
|
116
117
|
end
|
117
|
-
end
|
118
|
+
end
|
@@ -16,34 +16,33 @@ Effects:
|
|
16
16
|
|
17
17
|
class ActiveRecordArchiver
|
18
18
|
def self.import json
|
19
|
-
|
20
19
|
@data = JSON.parse json
|
21
20
|
|
22
21
|
ActiveRecord::Base.transaction do
|
23
|
-
|
24
|
-
# insert records
|
25
|
-
@data.each_pair do |model_name, records|
|
26
|
-
model = model_name.constantize
|
27
|
-
|
28
|
-
assert_model model
|
22
|
+
without_foreign_key_constraints do
|
29
23
|
|
30
|
-
|
31
|
-
|
24
|
+
# insert records
|
25
|
+
@data.each_pair do |model_name, records|
|
26
|
+
model = model_name.constantize
|
27
|
+
|
28
|
+
assert_model model
|
29
|
+
|
30
|
+
records.each do |record|
|
31
|
+
record[:id] = model.all.insert(insertable_hash(model, record))
|
32
|
+
end
|
32
33
|
end
|
33
|
-
end
|
34
|
-
|
35
|
-
# add relations
|
36
|
-
@data.each_pair do |model_name, records|
|
37
|
-
model = model_name.constantize
|
38
34
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
35
|
+
# add relations
|
36
|
+
@data.each_pair do |model_name, records|
|
37
|
+
model = model_name.constantize
|
38
|
+
|
39
|
+
records.each do |record|
|
40
|
+
if (update_hash = relations_update_hash(model, record))
|
41
|
+
model.where(:id => record[:id]).update_all(update_hash)
|
42
|
+
end
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
47
46
|
end
|
48
47
|
|
49
48
|
true
|