activerecord_mass_insert 0.1.0 → 0.2.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/README.md +3 -1
- data/activerecord_mass_insert.gemspec +2 -0
- data/lib/activerecord/mass_insert/inserter.rb +4 -2
- data/lib/activerecord/mass_insert/projection.rb +4 -2
- data/lib/activerecord/mass_insert/statement.rb +23 -4
- data/lib/activerecord/mass_insert/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc7e1b88f199bb60fa96b966661a69e2fed064ff
|
4
|
+
data.tar.gz: a43ed568b5b504dfa47c82ae23a0ba64d4da8287
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1f4c728c521a1c5932f794e5c87a29068175a0268dccf473801364391cbc2cf3ebc7f41c9d6d56e7498852fed3bbd8de2b7692bb71370eac9e820bbd52eba08
|
7
|
+
data.tar.gz: 01d447056198709f89b102c2957f8a41887337c12b828188f8c08f90ebcac9631e2ebea6b688cb8fb86b9c1edd746a102fb0ad541d6e838bde52fa890e8a167a
|
data/README.md
CHANGED
@@ -31,12 +31,14 @@ end
|
|
31
31
|
|
32
32
|
payload = '[{"name":"Madison","breed":"Golden","meta":{"rescue":false,"age":null}},{"name":"Daisy","meta":{"rescue":true,"age":18}},{"name":"Gracey","meta":{"rescue":false,"nickname":"Scoogie","age":11}},{"name":"Sadie","meta":{"rescue":true,"dingo_blood":true,"age":11}},{"name":"Raymond","meta":{"rescue":null,"nickname":"Radar","tail":false,"age":11}},{"name":"Nemo","meta":{"rescue":true,"number_of_ears":1,"age":2}}]'
|
33
33
|
|
34
|
-
dog_ids = Dog.mass_insert(payload
|
34
|
+
dog_ids = Dog.mass_insert(payload)
|
35
35
|
|
36
36
|
dogs = Dog.find(dog_ids)
|
37
37
|
|
38
38
|
puts dogs.count # => 6
|
39
39
|
puts dogs.first.name # => Madison
|
40
|
+
puts dogs.first.breed # => Golden
|
41
|
+
puts dogs.first.meta # => { "rescue" => false, "age" => null }
|
40
42
|
```
|
41
43
|
|
42
44
|
For a payload you can pass a JSON objects by itself, in a JSON array, or a ruby array. You can also
|
@@ -22,6 +22,8 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
23
|
spec.require_paths = ['lib']
|
24
24
|
|
25
|
+
spec.required_ruby_version = '>= 2.0.0'
|
26
|
+
|
25
27
|
spec.add_runtime_dependency 'activerecord', '>= 4.2.0'
|
26
28
|
spec.add_runtime_dependency 'pg', '>= 0.20.0'
|
27
29
|
|
@@ -8,8 +8,6 @@ module ActiveRecord
|
|
8
8
|
class Inserter < Statement
|
9
9
|
extend Forwardable
|
10
10
|
|
11
|
-
def_delegators :model, :primary_key, :arel_table, :connection
|
12
|
-
|
13
11
|
def self.insert(*args)
|
14
12
|
new(*args).insert
|
15
13
|
end
|
@@ -18,6 +16,10 @@ module ActiveRecord
|
|
18
16
|
connection.execute(sql)
|
19
17
|
end
|
20
18
|
|
19
|
+
private
|
20
|
+
|
21
|
+
def_delegators :model, :primary_key, :arel_table, :connection
|
22
|
+
|
21
23
|
def sql
|
22
24
|
[
|
23
25
|
model.send(:sanitize_sql_array, [statement.to_sql, payload]),
|
@@ -9,8 +9,6 @@ module ActiveRecord
|
|
9
9
|
class Projection < Statement
|
10
10
|
extend Forwardable
|
11
11
|
|
12
|
-
def_delegators :model, :column_for_attribute
|
13
|
-
|
14
12
|
def statement
|
15
13
|
init_args = []
|
16
14
|
init_args << arel_table.engine if arel_table.respond_to?(:engine)
|
@@ -21,6 +19,10 @@ module ActiveRecord
|
|
21
19
|
end
|
22
20
|
end
|
23
21
|
|
22
|
+
private
|
23
|
+
|
24
|
+
def_delegators :model, :column_for_attribute
|
25
|
+
|
24
26
|
def select
|
25
27
|
[
|
26
28
|
*matching_columns.map { |column| arel_table[column] },
|
@@ -4,17 +4,36 @@ module ActiveRecord
|
|
4
4
|
module MassInsert
|
5
5
|
# Common structure for all SQL statement builders
|
6
6
|
class Statement
|
7
|
-
attr_reader :model, :payload, :matching_columns, :mapped_columns
|
8
|
-
|
9
7
|
def initialize(model, payload, *matching_columns, **mapped_columns)
|
10
8
|
@model = model
|
11
9
|
@payload = payload_to_json_array(payload)
|
12
|
-
|
13
|
-
|
10
|
+
if matching_columns.empty? && mapped_columns.empty?
|
11
|
+
@matching_columns = fallback_matching_columns(model)
|
12
|
+
@mapped_columns = fallback_mapped_columns(model)
|
13
|
+
else
|
14
|
+
@matching_columns = matching_columns
|
15
|
+
@mapped_columns = mapped_columns
|
16
|
+
end
|
14
17
|
end
|
15
18
|
|
16
19
|
private
|
17
20
|
|
21
|
+
attr_reader :model, :payload, :matching_columns, :mapped_columns
|
22
|
+
|
23
|
+
def fallback_matching_columns(new_model)
|
24
|
+
new_model.columns.map(&:name) - [new_model.primary_key, 'created_at', 'updated_at']
|
25
|
+
end
|
26
|
+
|
27
|
+
def fallback_mapped_columns(new_model)
|
28
|
+
{}.tap do |result|
|
29
|
+
%w[created_at updated_at].each do |column|
|
30
|
+
if new_model.columns_hash.keys.include?(column)
|
31
|
+
result[column.to_sym] = Arel::Nodes::NamedFunction.new('NOW', [])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
18
37
|
def payload_to_json_array(new_payload)
|
19
38
|
if new_payload.nil?
|
20
39
|
new_payload = new_payload.to_s
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord_mass_insert
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Rove
|
@@ -184,7 +184,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
184
184
|
requirements:
|
185
185
|
- - ">="
|
186
186
|
- !ruby/object:Gem::Version
|
187
|
-
version:
|
187
|
+
version: 2.0.0
|
188
188
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
189
189
|
requirements:
|
190
190
|
- - ">="
|