never_wastes 0.0.7 → 0.0.8
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 +28 -0
- data/lib/never_wastes.rb +20 -8
- data/lib/never_wastes/version.rb +1 -1
- data/spec/fake_app.rb +7 -1
- data/spec/never_wastes_spec.rb +11 -1
- data/spec/spec_helper.rb +1 -0
- 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: c85ab18840099a907e37896a9fbdf155c84720fb
|
4
|
+
data.tar.gz: 9bfc863a688d3193001729ec8f7a3935cd27172f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 654a6ce77cf9a29bff70389bc8acc7f862a340cc575573cae72b4294513686d3af5f6a512a5d5fdf27e5447c7c304a229c67c70019624a3c4ca37275b5741c02
|
7
|
+
data.tar.gz: 738da964f16210ba589c578e99d5ffa0f06de65a5a68191fe548e589adb9c721687c82fd3844ffcdbd0cb67b6f4d72e8f328a6612daa62b8246be60d03600573
|
data/README.md
CHANGED
@@ -10,6 +10,8 @@ It's similar to acts_as_paranoid but simpler.
|
|
10
10
|
|
11
11
|
## Usage
|
12
12
|
|
13
|
+
### Migrations
|
14
|
+
|
13
15
|
First, add deleted column in your models.
|
14
16
|
|
15
17
|
class AddDeletedToYourModels < ActiveRecord::Migration
|
@@ -29,12 +31,38 @@ If you need a timestamp, you can also add deleted_at column.
|
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
34
|
+
If you need to have unique index for that table, waste_id will help.
|
35
|
+
|
36
|
+
class AddDeletedToYourModels < ActiveRecord::Migration
|
37
|
+
def change
|
38
|
+
add_column :your_models, :deleted, :boolean, :null => false, :default => false
|
39
|
+
add_column :your_models, :deleted_at, :datetime
|
40
|
+
add_column :your_models, :waste_id, :integer, :null => false, :default => 0
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
The waste_id supposed to be 0 when it's not deleted.
|
45
|
+
When the record is softly deleted, its primary key is copied to waste_id to be unique in all deleted records.
|
46
|
+
This helps you add unique index for some typical column like 'name' as the following example;
|
47
|
+
|
48
|
+
class AddNameIndexToYourModels < ActiveRecord::Migration
|
49
|
+
def up
|
50
|
+
add_index :your_models, [:name, :waste_id], :unique => true
|
51
|
+
end
|
52
|
+
|
53
|
+
# down is needed
|
54
|
+
end
|
55
|
+
|
56
|
+
### Declaration
|
57
|
+
|
32
58
|
Next step is to specify never_wastes in your model which needs soft delete.
|
33
59
|
|
34
60
|
class YourModel < ActiveRecord::Base
|
35
61
|
never_wastes
|
36
62
|
end
|
37
63
|
|
64
|
+
### Use APIs
|
65
|
+
|
38
66
|
Then you can use destroy for soft delete.
|
39
67
|
|
40
68
|
model.destroy
|
data/lib/never_wastes.rb
CHANGED
@@ -23,14 +23,10 @@ module NeverWastes
|
|
23
23
|
module SoftDestroy
|
24
24
|
def self.included(base)
|
25
25
|
base.class_eval do
|
26
|
-
class_attribute :never_wastes_boolean_column_name, :never_wastes_datetime_column_name
|
26
|
+
class_attribute :never_wastes_boolean_column_name, :never_wastes_datetime_column_name, :never_wastes_id_column_name
|
27
27
|
self.never_wastes_boolean_column_name = :deleted
|
28
28
|
self.never_wastes_datetime_column_name = :deleted_at
|
29
|
-
|
30
|
-
stamps = {never_wastes_boolean_column_name => true}
|
31
|
-
stamps[never_wastes_datetime_column_name] = self.current_time if column_names.include?(never_wastes_datetime_column_name.to_s)
|
32
|
-
stamps
|
33
|
-
end
|
29
|
+
self.never_wastes_id_column_name = :waste_id
|
34
30
|
|
35
31
|
alias_method :destroy!, :destroy
|
36
32
|
|
@@ -38,7 +34,7 @@ module NeverWastes
|
|
38
34
|
@destroying_softly = true
|
39
35
|
ret = with_transaction_returning_status do
|
40
36
|
run_callbacks :destroy do
|
41
|
-
stamps =
|
37
|
+
stamps = soft_destroy_stamps
|
42
38
|
self.class.where(self.class.primary_key.to_sym => id).update_all(stamps)
|
43
39
|
stamps.each {|key, value| send("#{key}=", value)}
|
44
40
|
@destroyed = true
|
@@ -59,12 +55,28 @@ module NeverWastes
|
|
59
55
|
|
60
56
|
alias_method :delete_all!, :delete_all
|
61
57
|
def delete_all_softly
|
62
|
-
|
58
|
+
updates = sanitize_sql_for_assignment(never_wastes_boolean_column_name => true)
|
59
|
+
if column_names.include?(never_wastes_datetime_column_name.to_s)
|
60
|
+
updates << ","
|
61
|
+
updates << sanitize_sql_for_assignment(never_wastes_datetime_column_name => current_time)
|
62
|
+
end
|
63
|
+
if column_names.include?(never_wastes_id_column_name.to_s)
|
64
|
+
updates << ","
|
65
|
+
updates << "#{never_wastes_id_column_name.to_s} = #{primary_key}"
|
66
|
+
end
|
67
|
+
update_all(updates)
|
63
68
|
end
|
64
69
|
alias_method :delete_all, :delete_all_softly
|
65
70
|
end
|
66
71
|
|
67
72
|
private
|
73
|
+
def soft_destroy_stamps
|
74
|
+
stamps = {self.class.never_wastes_boolean_column_name => true}
|
75
|
+
stamps[self.class.never_wastes_datetime_column_name] = self.class.current_time if self.class.column_names.include?(self.class.never_wastes_datetime_column_name.to_s)
|
76
|
+
stamps[self.class.never_wastes_id_column_name] = id if self.class.column_names.include?(self.class.never_wastes_id_column_name.to_s)
|
77
|
+
stamps
|
78
|
+
end
|
79
|
+
|
68
80
|
# useful in callbacks
|
69
81
|
def destroying_softly?
|
70
82
|
@destroying_softly
|
data/lib/never_wastes/version.rb
CHANGED
data/spec/fake_app.rb
CHANGED
@@ -8,7 +8,13 @@ ActiveRecord::Base.establish_connection('test')
|
|
8
8
|
#migrations
|
9
9
|
class CreateAllTables < ActiveRecord::Migration
|
10
10
|
def self.up
|
11
|
-
create_table(:users)
|
11
|
+
create_table(:users) do |t|
|
12
|
+
t.string :name
|
13
|
+
t.boolean :deleted, :null => false, :default => false
|
14
|
+
t.datetime :deleted_at
|
15
|
+
t.integer :waste_id, :null => false, :default => 0
|
16
|
+
end
|
17
|
+
add_index :users, [:name, :waste_id], :unique => true
|
12
18
|
end
|
13
19
|
end
|
14
20
|
|
data/spec/never_wastes_spec.rb
CHANGED
@@ -19,6 +19,12 @@ describe User do
|
|
19
19
|
subject { User.new(name: user.name) }
|
20
20
|
it { should be_valid }
|
21
21
|
end
|
22
|
+
|
23
|
+
context "when the same name user exists and is deleted, and the other is going to be deleted, when there is an unique index" do
|
24
|
+
before { user.destroy }
|
25
|
+
let(:other) { User.create!(name: user.name) }
|
26
|
+
it { expect { other.destroy }.not_to raise_error }
|
27
|
+
end
|
22
28
|
end
|
23
29
|
end
|
24
30
|
|
@@ -28,13 +34,15 @@ describe User do
|
|
28
34
|
|
29
35
|
context 'when user is not deleted' do
|
30
36
|
its(:deleted) { should be_false }
|
31
|
-
its(:deleted_at) { should be_nil}
|
37
|
+
its(:deleted_at) { should be_nil }
|
38
|
+
its(:waste_id) { should eq(0) }
|
32
39
|
end
|
33
40
|
|
34
41
|
context 'when user is deleted' do
|
35
42
|
before { user.destroy }
|
36
43
|
its(:deleted) { should be_true }
|
37
44
|
its(:deleted_at) { should_not be_nil }
|
45
|
+
its(:waste_id) { should eq(user.id)}
|
38
46
|
end
|
39
47
|
end
|
40
48
|
|
@@ -92,12 +100,14 @@ describe User do
|
|
92
100
|
subject { undelete_user.reload }
|
93
101
|
its(:deleted) { should be_false }
|
94
102
|
its(:deleted_at) { should be_nil}
|
103
|
+
its(:waste_id) { should eq(0) }
|
95
104
|
end
|
96
105
|
|
97
106
|
context 'when user is deleted' do
|
98
107
|
subject { delete_users.first.reload }
|
99
108
|
its(:deleted) { should be_true }
|
100
109
|
its(:deleted_at) { should_not be_nil }
|
110
|
+
its(:waste_id) { should eq(delete_users.first.id) }
|
101
111
|
end
|
102
112
|
end
|
103
113
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: never_wastes
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- nay3
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-10-
|
11
|
+
date: 2013-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|