active_record_patch_first_or_create 0.0.4 → 1.0.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/Gemfile +14 -0
- data/README.md +19 -8
- data/Rakefile +6 -0
- data/active_record_patch_first_or_create.gemspec +5 -0
- data/lib/active_record_patch_first_or_create.rb +1 -1
- data/lib/active_record_patch_first_or_create/version.rb +1 -1
- metadata +72 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c5478264fa26b04687d1f600cec8ebcf8c26cf68
|
4
|
+
data.tar.gz: 26c207ae53c67c8b4b128d5c7d81aeeac0e598f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7742d1e4bc569d0288d14bb27e64755acacac0718edc1355efc5003ec31cecf6859c4e23bc61b8c4c2dac4705edcb6b8592d19c07a1bb87ed50d11613f57cb2a
|
7
|
+
data.tar.gz: 125ae54308548403d7ef4993f5ae457c786a55f94314ceb0a2e93fe237e7889ec9c11f572439e6eefe63e3ffe53997220352bfc6731bd596b9d438a978e3aa5e
|
data/Gemfile
CHANGED
@@ -2,3 +2,17 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in active_record_patch_first_or_create.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
group :testing do
|
7
|
+
gem "pry"
|
8
|
+
gem "pry-doc"
|
9
|
+
|
10
|
+
gem "guard"
|
11
|
+
gem "guard-minitest"
|
12
|
+
gem "guard-yard"
|
13
|
+
|
14
|
+
gem "rb-fsevent"
|
15
|
+
gem "terminal-notifier-guard"
|
16
|
+
|
17
|
+
gem 'simplecov', :require => false
|
18
|
+
end
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# ActiveRecordPatchFirstOrCreate
|
2
2
|
|
3
|
-
|
3
|
+
Real atomic first_or_create/find_or_create_by for Rails
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -16,14 +16,25 @@ Or install it yourself as:
|
|
16
16
|
|
17
17
|
$ gem install active_record_patch_first_or_create
|
18
18
|
|
19
|
+
## Solution
|
20
|
+
|
21
|
+
We find out that methods like first_or_create or find_or_create_by are not atomic, you can check docs here
|
22
|
+
|
23
|
+
"Please note *this method is not atomic*, it runs first a SELECT, and if there are no results an INSERT is attempted. If there are other threads or processes there is a race condition between both calls and it could be the case that you end up with two similar records."
|
24
|
+
|
19
25
|
## Usage
|
20
26
|
|
21
|
-
|
27
|
+
Finds the first record with the given attributes, or creates a record with the attributes if one is not found:
|
28
|
+
|
29
|
+
# Find the first user with uid "abc123" or create a new one.
|
30
|
+
User.where(uid: 'abc123').atomic_first_or_create(name: 'John', uid: 'abc123')
|
31
|
+
# => #<User id: 1, uid: "abc123", name: 'John'>
|
22
32
|
|
23
|
-
|
33
|
+
# Find the first user with uid "abc123" or create a new one.
|
34
|
+
# We already have one so the existing record will be returned.
|
35
|
+
User.where(uid: 'abc123').atomic_first_or_create(name: 'John', uid: 'abc123')
|
36
|
+
# => #<User id: 1, uid: "abc123", name: 'John'>
|
24
37
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
-
5. Create new Pull Request
|
38
|
+
# Find the first user with uid "abc1234" or create a new one
|
39
|
+
User.where(uid: 'abc123').atomic_first_or_create(name: 'Johansson', uid: 'abc1234')
|
40
|
+
# => #<User id: 2, uid: "abc1234", name: 'Johansson'>
|
data/Rakefile
CHANGED
@@ -20,4 +20,9 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.5"
|
22
22
|
spec.add_development_dependency "rake", "~> 0"
|
23
|
+
spec.add_development_dependency "minitest"
|
24
|
+
spec.add_development_dependency "mocha"
|
25
|
+
spec.add_development_dependency "webmock"
|
26
|
+
spec.add_development_dependency "activerecord"
|
27
|
+
spec.add_development_dependency "sqlite3"
|
23
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record_patch_first_or_create
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NDrive DevOps Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -38,6 +38,76 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: mocha
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: webmock
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: activerecord
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: sqlite3
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
41
111
|
description: This patch provides first_or_create method to be atomic, once the default
|
42
112
|
one isn't!!!
|
43
113
|
email:
|