active_record-updated_at 0.0.0 → 0.0.1
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.lock +1 -1
- data/README.md +5 -5
- data/active_record-updated_at.gemspec +1 -1
- data/lib/active_record/updated_at/relation.rb +4 -10
- data/lib/active_record-updated_at.rb +21 -4
- data/spec/active_record-updated_at_spec.rb +19 -5
- metadata +1 -2
- data/lib/active_record/updated_at/model.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 395371ee4b162e5c5bf8235811222b4097e6ead7
|
4
|
+
data.tar.gz: d2b3362724771f82de0efb358348025eaf937da7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b859883939d611983f98be7d5495e0aaad6888f443548ac7a5fb8bf05e17ba9f5b95ef72d7ff7b006eb982b857e0728c71c53a75f2d5b53f290761fdd98d0f0b
|
7
|
+
data.tar.gz: 5d9496e37271d9e5c1e0c1b84a03be46cb4b98bd6c6aaaf519d4e0c07abbdc5b037925d85dbcee7eaaf6702cdafcf6357cc2a34878c05514b6eba88e79fdb81f
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -19,11 +19,11 @@ The default `ActiveRecord` behavior does not touch `updated_at` when the followi
|
|
19
19
|
* `ActiveRecord::Base#update_columns`
|
20
20
|
* `ActiveRecord::Relation#update_all`
|
21
21
|
|
22
|
-
We **rarely ever have a case to modify data WITHOUT touching `updated_at`** so this gem enables the touching behavior by default. For those rare occassions that we don't want the touching we can
|
22
|
+
We **rarely ever have a case to modify data WITHOUT touching `updated_at`** so this gem enables the touching behavior by default. For those rare occassions that we don't want the touching we can wrap these calls in a `disable` block explicitly:
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
24
|
+
```ruby
|
25
|
+
ActiveRecord::UpdatedAt.disable { User.update_all(role: "member") }
|
26
|
+
```
|
27
27
|
|
28
28
|
**If `updated_at` is explicitly specified then the UPDATE query is not modified**.
|
29
29
|
|
@@ -38,7 +38,7 @@ User.update_all(role: "member", updated_at: 1.day.ago)
|
|
38
38
|
User.update_all(role: "member", updated_at: nil)
|
39
39
|
|
40
40
|
# This doesn't touch `updated_at`
|
41
|
-
User.
|
41
|
+
ActiveRecord::UpdatedAt.disable { User.update_all(role: "member") }
|
42
42
|
```
|
43
43
|
|
44
44
|
## Testing
|
@@ -11,7 +11,7 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.required_ruby_version = ">= 2.0.0"
|
12
12
|
s.summary = "Touch `updated_at` by default with calls to `update_column(s)` and `update_all`"
|
13
13
|
s.test_files = `git ls-files -- spec/*`.split("\n")
|
14
|
-
s.version = "0.0.
|
14
|
+
s.version = "0.0.1"
|
15
15
|
|
16
16
|
s.add_dependency "activerecord"
|
17
17
|
end
|
@@ -1,19 +1,13 @@
|
|
1
1
|
module ActiveRecord
|
2
2
|
module UpdatedAt
|
3
3
|
module Relation
|
4
|
-
|
5
|
-
|
6
|
-
included do
|
7
|
-
alias_method :update_all_without_updated_at, :update_all
|
8
|
-
alias_method :update_all, :update_all_with_updated_at
|
9
|
-
end
|
10
|
-
|
11
|
-
def update_all_with_updated_at(query, *args, &block)
|
4
|
+
def update_all(query, *args, &block)
|
12
5
|
attribute_exists = column_names.include?("updated_at")
|
13
6
|
already_specified = Array(query).flatten.grep(/\bupdated_at\b/).any?
|
7
|
+
enabled = UpdatedAt.enabled?
|
14
8
|
updated_at = Time.current
|
15
9
|
|
16
|
-
if attribute_exists && !already_specified
|
10
|
+
if attribute_exists && !already_specified && enabled
|
17
11
|
case query
|
18
12
|
when Array
|
19
13
|
query.first << ", updated_at = ?"
|
@@ -25,7 +19,7 @@ module ActiveRecord
|
|
25
19
|
end
|
26
20
|
end
|
27
21
|
|
28
|
-
|
22
|
+
super
|
29
23
|
end
|
30
24
|
end
|
31
25
|
end
|
@@ -1,9 +1,26 @@
|
|
1
1
|
require "active_record"
|
2
|
-
require_relative "active_record/updated_at/model"
|
3
2
|
require_relative "active_record/updated_at/relation"
|
4
3
|
|
5
4
|
module ActiveRecord
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
module UpdatedAt
|
6
|
+
ActiveRecord::Relation.send(:prepend, Relation)
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def disable(state = true)
|
10
|
+
disabled_was = @disabled
|
11
|
+
@disabled = state
|
12
|
+
yield
|
13
|
+
ensure
|
14
|
+
@disabled = disabled_was
|
15
|
+
end
|
16
|
+
|
17
|
+
def enable(&block)
|
18
|
+
disable(false, &block)
|
19
|
+
end
|
20
|
+
|
21
|
+
def enabled?
|
22
|
+
!@disabled
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
9
26
|
end
|
@@ -4,6 +4,20 @@ RSpec.describe ActiveRecord::UpdatedAt do
|
|
4
4
|
let!(:user) { User.create!(name: "test") }
|
5
5
|
let!(:timestamp) { 1.day.ago }
|
6
6
|
|
7
|
+
describe "#enabled" do
|
8
|
+
it "can be nested with disable blocks" do
|
9
|
+
expect(described_class).to be_enabled
|
10
|
+
|
11
|
+
described_class.disable do
|
12
|
+
expect(described_class).not_to be_enabled
|
13
|
+
described_class.enable { expect(described_class).to be_enabled }
|
14
|
+
expect(described_class).not_to be_enabled
|
15
|
+
end
|
16
|
+
|
17
|
+
expect(described_class).to be_enabled
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
7
21
|
describe "#update_all" do
|
8
22
|
context "with an array" do
|
9
23
|
it "touches updated_at" do
|
@@ -19,7 +33,7 @@ RSpec.describe ActiveRecord::UpdatedAt do
|
|
19
33
|
end
|
20
34
|
|
21
35
|
it "does not touch updated_at with workaround method" do
|
22
|
-
User.
|
36
|
+
described_class.disable { User.update_all(["name = ?", "changed"]) }
|
23
37
|
expect(reloaded.name).to eq("changed")
|
24
38
|
expect(reloaded.updated_at).to eq(user.updated_at)
|
25
39
|
end
|
@@ -39,7 +53,7 @@ RSpec.describe ActiveRecord::UpdatedAt do
|
|
39
53
|
end
|
40
54
|
|
41
55
|
it "does not touch updated_at with workaround method" do
|
42
|
-
User.
|
56
|
+
described_class.disable { User.update_all(name: "changed") }
|
43
57
|
expect(reloaded.name).to eq("changed")
|
44
58
|
expect(reloaded.updated_at).to eq(user.updated_at)
|
45
59
|
end
|
@@ -60,7 +74,7 @@ RSpec.describe ActiveRecord::UpdatedAt do
|
|
60
74
|
end
|
61
75
|
|
62
76
|
it "does not touch updated_at with workaround method" do
|
63
|
-
User.
|
77
|
+
described_class.disable { User.update_all("name = 'changed'") }
|
64
78
|
expect(reloaded.name).to eq("changed")
|
65
79
|
expect(reloaded.updated_at).to eq(user.updated_at)
|
66
80
|
end
|
@@ -80,7 +94,7 @@ RSpec.describe ActiveRecord::UpdatedAt do
|
|
80
94
|
end
|
81
95
|
|
82
96
|
it "does not touch updated_at with workaround method" do
|
83
|
-
user.
|
97
|
+
described_class.disable { user.update_column(:name, "changed") }
|
84
98
|
expect(reloaded.name).to eq("changed")
|
85
99
|
expect(reloaded.updated_at).to eq(user.updated_at)
|
86
100
|
end
|
@@ -100,7 +114,7 @@ RSpec.describe ActiveRecord::UpdatedAt do
|
|
100
114
|
end
|
101
115
|
|
102
116
|
it "does not touch updated_at with workaround method" do
|
103
|
-
user.
|
117
|
+
described_class.disable { user.update_columns(name: "changed") }
|
104
118
|
expect(reloaded.name).to eq("changed")
|
105
119
|
expect(reloaded.updated_at).to eq(user.updated_at)
|
106
120
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record-updated_at
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- LendingHome
|
@@ -45,7 +45,6 @@ files:
|
|
45
45
|
- bin/test
|
46
46
|
- docker-compose.yml
|
47
47
|
- lib/active_record-updated_at.rb
|
48
|
-
- lib/active_record/updated_at/model.rb
|
49
48
|
- lib/active_record/updated_at/relation.rb
|
50
49
|
- spec/active_record-updated_at_spec.rb
|
51
50
|
- spec/internal/app/models/user.rb
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module ActiveRecord
|
2
|
-
module UpdatedAt
|
3
|
-
module Model
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
|
6
|
-
included do
|
7
|
-
alias_method :update_columns_without_updated_at, :update_columns
|
8
|
-
alias_method :update_columns, :update_columns_with_updated_at
|
9
|
-
end
|
10
|
-
|
11
|
-
def update_column_without_updated_at(attribute, value)
|
12
|
-
update_columns_without_updated_at(attribute => value)
|
13
|
-
end
|
14
|
-
|
15
|
-
def update_columns_with_updated_at(attributes)
|
16
|
-
attribute_exists = has_attribute?(:updated_at)
|
17
|
-
already_specified = attributes.with_indifferent_access.key?(:updated_at)
|
18
|
-
|
19
|
-
if attribute_exists && !already_specified
|
20
|
-
attributes[:updated_at] = Time.current
|
21
|
-
end
|
22
|
-
|
23
|
-
update_columns_without_updated_at(attributes)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|