activerecord-bulk_insert 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7549b76b706ba981379ca0108080c10cb2015f4888317c2906a336bfe16170d6
4
- data.tar.gz: 4dcc348245d7a65677aee685683db5ff3f10c3b83de78ec0886ccccae4052d00
3
+ metadata.gz: 54c973ddc1c628c1960a516fbb77529e88c2ef55b7f81390524f08d9551954a9
4
+ data.tar.gz: 782d2dc1342711ee66625fcb191d2b7dedd9198d4ad7489462ca118196ae5f16
5
5
  SHA512:
6
- metadata.gz: 961c56b939cb3c7207fd1617b50b386340a015df2c3eeb65620409ca3c95c7aa9325a16e52644b8fdd202b278c7b05410d01ed1e1787b96606a078ecadfd2a2b
7
- data.tar.gz: d0b6b76994579ffaa2ff8072f832883962a0ecd6f9324d65dfd470124f10e0569e00d09b0fb1eddc2213b7097caa7c4c3e1dfba7ece4c65f8ae82ba831dabdf0
6
+ metadata.gz: d114588226c16377c365ede8468978685de4c6379593f0a5b1d57ce5f2456ce34b607c7f70bd2513804c58dd335fdf9bd0ffb8a9e1c06da45c2601d6d2a706f5
7
+ data.tar.gz: 40998b00099c24b7056826a270addcab48ae94110767a3f3e110983bb5be03fc61098a6bd7a381e613df8781d4ecf36a73746edf62382d1623c3f1a75bd3fe1d
data/.rubocop.yml CHANGED
@@ -55,3 +55,7 @@ Style/PercentLiteralDelimiters:
55
55
 
56
56
  Style/StringLiterals:
57
57
  EnforcedStyle: double_quotes
58
+
59
+ Naming/FileName:
60
+ Exclude:
61
+ - "lib/activerecord-bulk_insert.rb"
data/.travis.yml CHANGED
@@ -5,3 +5,6 @@ cache: bundler
5
5
  rvm:
6
6
  - 2.6.3
7
7
  before_install: gem install bundler -v 2.0.2
8
+ script:
9
+ - bundle exec rake spec
10
+ - bundle exec rubocop
data/README.md CHANGED
@@ -16,10 +16,42 @@ And then execute:
16
16
 
17
17
  ## Usage
18
18
 
19
+ `bulk_insert` with new records.
20
+ Insert new records one by one.
21
+
22
+ ```ruby
23
+ users = [*1..10].map { |i| User.new(name: "user#{i}") }
24
+ User.bulk_insert(users)
25
+ ```
26
+
27
+ ```sql
28
+ INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES ('user1', '2019-08-23 15:37:46', '2019-08-23 15:37:46');
29
+ INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES ('user2', '2019-08-23 15:37:46', '2019-08-23 15:37:46');
30
+ INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES ('user3', '2019-08-23 15:37:46', '2019-08-23 15:37:46');
31
+ INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES ('user4', '2019-08-23 15:37:46', '2019-08-23 15:37:46');
32
+ INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES ('user5', '2019-08-23 15:37:46', '2019-08-23 15:37:46');
33
+ INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES ('user6', '2019-08-23 15:37:46', '2019-08-23 15:37:46');
34
+ INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES ('user7', '2019-08-23 15:37:46', '2019-08-23 15:37:46');
35
+ INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES ('user8', '2019-08-23 15:37:46', '2019-08-23 15:37:46');
36
+ INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES ('user9', '2019-08-23 15:37:46', '2019-08-23 15:37:46');
37
+ INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES ('user10', '2019-08-23 15:37:46', '2019-08-23 15:37:46');
38
+ ```
39
+
40
+ Specify `ignore_new_record` for bulk insert.
41
+ autoincrement and default values are not reflected.
42
+
19
43
  ```ruby
20
44
  users = [*1..10].map { |i| User.new(name: "user#{i}") }
21
45
  User.bulk_insert(users, ignore_new_record: false)
46
+ ```
47
+
48
+ ```sql
49
+ INSERT INTO `users`(`created_at`,`updated_at`,`name`) VALUES ('2019-08-23 15:28:35', '2019-08-23 15:28:35', 'user1'), ('2019-08-23 15:28:35', '2019-08-23 15:28:35', 'user2'), ('2019-08-23 15:28:35', '2019-08-23 15:28:35', 'user3'), ('2019-08-23 15:28:35', '2019-08-23 15:28:35', 'user4'), ('2019-08-23 15:28:35', '2019-08-23 15:28:35', 'user5'), ('2019-08-23 15:28:35', '2019-08-23 15:28:35', 'user6'), ('2019-08-23 15:28:35', '2019-08-23 15:28:35', 'user7'), ('2019-08-23 15:28:35', '2019-08-23 15:28:35', 'user8'), ('2019-08-23 15:28:35', '2019-08-23 15:28:35', 'user9'), ('2019-08-23 15:28:35', '2019-08-23 15:28:35.964720', 'user10');
50
+ ```
22
51
 
52
+ Existing records are bulk updated.
53
+
54
+ ```ruby
23
55
  users = User.all
24
56
  users.each do |user|
25
57
  user.name = "user#{user.id * 2}"
@@ -27,6 +59,10 @@ end
27
59
  User.bulk_insert(users)
28
60
  ```
29
61
 
62
+ ```sql
63
+ INSERT INTO `users`(`created_at`,`updated_at`,`name`) VALUES ('2019-08-23 15:28:35', '2019-08-23 15:34:49', 'user2'), ('2019-08-23 15:28:35', '2019-08-23 15:34:49', 'user4'), ('2019-08-23 15:28:35', '2019-08-23 15:34:49', 'user6'), ('2019-08-23 15:28:35', '2019-08-23 15:34:49', 'user8'), ('2019-08-23 15:28:35', '2019-08-23 15:34:49', 'user10'), ('2019-08-23 15:28:35', '2019-08-23 15:34:49', 'user12'), ('2019-08-23 15:28:35', '2019-08-23 15:34:49', 'user14'), ('2019-08-23 15:28:35', '2019-08-23 15:34:49', 'user16'), ('2019-08-23 15:28:35', '2019-08-23 15:34:49', 'user18'), ('2019-08-23 15:28:35', '2019-08-23 15:34:49', 'user20') ON DUPLICATE KEY UPDATE `created_at`=VALUES(`created_at`),`updated_at`=VALUES(`updated_at`),`name`=VALUES(`name`);
64
+ ```
65
+
30
66
  ## Development
31
67
 
32
68
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -1,60 +1,55 @@
1
1
  require "active_record"
2
- require "active_support/concern"
3
2
  require "active_support/lazy_load_hooks"
4
3
 
5
4
  require "active_record/bulk_insert/version"
6
5
 
7
6
  module ActiveRecord
8
7
  module BulkInsert
9
- extend ActiveSupport::Concern
10
-
11
- class_methods do
12
- def bulk_insert(objects, ignore_new_record: true)
13
- result = objects.group_by(&:new_record?).map { |is_new_record, records|
14
- if is_new_record
15
- if ignore_new_record
16
- records.each(&:save!)
17
- else
18
- insert_all!(build_attributes(records))
19
- end
8
+ def bulk_insert(objects, ignore_new_record: true)
9
+ result = objects.group_by(&:new_record?).map { |is_new_record, records|
10
+ if is_new_record
11
+ if ignore_new_record
12
+ records.each(&:save!)
20
13
  else
21
- upsert_all(build_attributes(records))
14
+ insert_all!(build_attributes(records))
22
15
  end
16
+ else
17
+ upsert_all(build_attributes(records))
18
+ end
23
19
 
24
- records
25
- }
20
+ records
21
+ }
26
22
 
27
- result.flatten
28
- end
23
+ result.flatten
24
+ end
29
25
 
30
- private
26
+ private
31
27
 
32
- def build_attributes(objects)
33
- keys = [required_keys, changed_keys(objects)].flatten.uniq
28
+ def build_attributes(objects)
29
+ keys = [required_keys, changed_keys(objects)].flatten.uniq
34
30
 
35
- objects.map { |object| Hash[keys.map { |k| [k, object.public_send(k)] }] }
36
- end
31
+ objects.map { |object| Hash[keys.map { |k| [k, object.public_send(k)] }] }
32
+ end
37
33
 
38
- def required_keys
39
- @required_keys ||= columns.map { |column|
40
- next if column.null
34
+ def required_keys
35
+ @required_keys ||= columns.map { |column|
36
+ next if column.null
41
37
 
42
- column.name
43
- }.compact - [primary_key]
44
- end
38
+ column.name
39
+ }.compact - [primary_key]
40
+ end
45
41
 
46
- def changed_keys(objects)
47
- now = Time.current
48
- objects.map { |object|
49
- object.updated_at = now
50
- object.created_at ||= now
51
- object.changed_attributes.keys
52
- }.flatten.uniq.compact
53
- end
54
- end
42
+ def changed_keys(objects)
43
+ now = Time.current
44
+ objects.map { |object|
45
+ object.updated_at = now
46
+ object.created_at ||= now
47
+ object.changed_attributes.keys
48
+ }.flatten.uniq.compact
49
+ end
55
50
  end
56
51
  end
57
52
 
58
53
  ActiveSupport.on_load(:active_record) do
59
- ActiveRecord::Base.include(ActiveRecord::BulkInsert)
54
+ ActiveRecord::Base.extend(ActiveRecord::BulkInsert)
60
55
  end
@@ -1,5 +1,5 @@
1
1
  module Activerecord
2
2
  module BulkInsert
3
- VERSION = "0.0.1".freeze
3
+ VERSION = "0.0.2".freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-bulk_insert
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - i2bskn