soft_deletion 0.5.6 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Readme.md +30 -24
- data/lib/soft_deletion/version.rb +1 -1
- metadata +110 -22
- data/.gitignore +0 -1
- data/.travis.yml +0 -17
- data/Appraisals +0 -23
- data/Gemfile +0 -11
- data/Gemfile.lock +0 -54
- data/MIT-LICENSE +0 -20
- data/Rakefile +0 -11
- data/gem-public_cert.pem +0 -20
- data/gemfiles/rails2.gemfile +0 -14
- data/gemfiles/rails3.gemfile +0 -14
- data/gemfiles/rails30.gemfile +0 -14
- data/gemfiles/rails32.gemfile +0 -14
- data/gemfiles/rails4.gemfile +0 -14
- data/soft_deletion.gemspec +0 -17
- data/spec/soft_deletion_spec.rb +0 -510
- data/spec/spec_helper.rb +0 -194
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9ea041113a1bcda2beb027912c991004618fd65f
|
4
|
+
data.tar.gz: 688f94c0f45493796830547db7aa13da7d976578
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d953a3f005716ba02311c7bb969fcd2c4c47a5725472448a65abf725311b69aac6973d659ec269d98bb48e354fc82d00f6a4f9afd8b647380e84d0e24bd7d9c0
|
7
|
+
data.tar.gz: bffbb5365381cf0506ed69d27e7e20d9c8b90c531cdede45c292eae385a03ff6e3d3324823ea443a12cba1a58828cd779d8f585d658c268c9099c24333d718e5
|
data/Readme.md
CHANGED
@@ -3,40 +3,46 @@ Not overwriting destroy or delete.
|
|
3
3
|
|
4
4
|
Install
|
5
5
|
=======
|
6
|
-
|
6
|
+
|
7
|
+
```Bash
|
8
|
+
gem install soft_deletion
|
9
|
+
```
|
7
10
|
|
8
11
|
Usage
|
9
12
|
=====
|
10
|
-
require 'soft_deletion'
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
+
```Ruby
|
15
|
+
require 'soft_deletion'
|
16
|
+
|
17
|
+
class User < ActiveRecord::Base
|
18
|
+
has_soft_deletion :default_scope => true
|
14
19
|
|
15
|
-
|
16
|
-
|
20
|
+
before_soft_delete :validate_deletability # soft_delete stops if this returns false
|
21
|
+
after_soft_delete :send_deletion_emails
|
17
22
|
|
18
|
-
|
19
|
-
|
23
|
+
has_many :products
|
24
|
+
end
|
20
25
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
+
# soft delete them including all soft-deletable dependencies that are marked as :destroy, :delete_all, :nullify
|
27
|
+
user = User.first
|
28
|
+
user.products.count == 10
|
29
|
+
user.soft_delete!
|
30
|
+
user.deleted? # true
|
26
31
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
32
|
+
# use special with_deleted scope to find them ...
|
33
|
+
user.reload # ActiveRecord::RecordNotFound
|
34
|
+
User.with_deleted do
|
35
|
+
user.reload # there it is ...
|
36
|
+
user.products.count == 0
|
37
|
+
end
|
33
38
|
|
34
|
-
|
35
|
-
|
36
|
-
|
39
|
+
# soft undelete them all
|
40
|
+
user.soft_undelete!
|
41
|
+
user.products.count == 10
|
37
42
|
|
38
|
-
|
39
|
-
|
43
|
+
# soft delete many
|
44
|
+
User.soft_delete_all!(1,2,3,4)
|
45
|
+
```
|
40
46
|
|
41
47
|
TODO
|
42
48
|
====
|
metadata
CHANGED
@@ -1,43 +1,131 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: soft_deletion
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zendesk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
11
|
+
date: 2015-08-27 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activerecord
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.2.0
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 4.3.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 3.2.0
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 4.3.0
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: rake
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
type: :development
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: sqlite3
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rspec
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '2.0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '2.0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: database_cleaner
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 1.0.0
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 1.0.0
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: bump
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
- !ruby/object:Gem::Dependency
|
104
|
+
name: wwtd
|
105
|
+
requirement: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ">="
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
type: :development
|
111
|
+
prerelease: false
|
112
|
+
version_requirements: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
13
117
|
description:
|
14
118
|
email: michael@grosser.it
|
15
119
|
executables: []
|
16
120
|
extensions: []
|
17
121
|
extra_rdoc_files: []
|
18
122
|
files:
|
19
|
-
- .gitignore
|
20
|
-
- .travis.yml
|
21
|
-
- Appraisals
|
22
|
-
- Gemfile
|
23
|
-
- Gemfile.lock
|
24
|
-
- MIT-LICENSE
|
25
|
-
- Rakefile
|
26
123
|
- Readme.md
|
27
|
-
- gem-public_cert.pem
|
28
|
-
- gemfiles/rails2.gemfile
|
29
|
-
- gemfiles/rails3.gemfile
|
30
|
-
- gemfiles/rails30.gemfile
|
31
|
-
- gemfiles/rails32.gemfile
|
32
|
-
- gemfiles/rails4.gemfile
|
33
124
|
- lib/soft_deletion.rb
|
34
125
|
- lib/soft_deletion/core.rb
|
35
126
|
- lib/soft_deletion/dependency.rb
|
36
127
|
- lib/soft_deletion/setup.rb
|
37
128
|
- lib/soft_deletion/version.rb
|
38
|
-
- soft_deletion.gemspec
|
39
|
-
- spec/soft_deletion_spec.rb
|
40
|
-
- spec/spec_helper.rb
|
41
129
|
homepage: https://github.com/grosser/soft_deletion
|
42
130
|
licenses:
|
43
131
|
- MIT
|
@@ -48,17 +136,17 @@ require_paths:
|
|
48
136
|
- lib
|
49
137
|
required_ruby_version: !ruby/object:Gem::Requirement
|
50
138
|
requirements:
|
51
|
-
- -
|
139
|
+
- - ">="
|
52
140
|
- !ruby/object:Gem::Version
|
53
141
|
version: '0'
|
54
142
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
55
143
|
requirements:
|
56
|
-
- -
|
144
|
+
- - ">="
|
57
145
|
- !ruby/object:Gem::Version
|
58
146
|
version: '0'
|
59
147
|
requirements: []
|
60
148
|
rubyforge_project:
|
61
|
-
rubygems_version: 2.
|
149
|
+
rubygems_version: 2.2.2
|
62
150
|
signing_key:
|
63
151
|
specification_version: 4
|
64
152
|
summary: Explicit soft deletion for ActiveRecord via deleted_at and default scope.
|
data/.gitignore
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
gemfiles/*.gemfile.lock
|
data/.travis.yml
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
rvm:
|
2
|
-
- 1.9.3
|
3
|
-
- ree
|
4
|
-
- 2.0
|
5
|
-
gemfile:
|
6
|
-
- gemfiles/rails2.gemfile
|
7
|
-
- gemfiles/rails32.gemfile
|
8
|
-
- gemfiles/rails4.gemfile
|
9
|
-
matrix:
|
10
|
-
exclude:
|
11
|
-
- rvm: 2.0
|
12
|
-
gemfile: gemfiles/rails2.gemfile
|
13
|
-
- rvm: 2.0
|
14
|
-
gemfile: gemfiles/rails30.gemfile
|
15
|
-
- rvm: ree
|
16
|
-
gemfile: gemfiles/rails4.gemfile
|
17
|
-
script: "bundle exec rake spec"
|
data/Appraisals
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
appraise "rails2" do
|
2
|
-
version = "2.3.18"
|
3
|
-
gem 'activerecord', version
|
4
|
-
gem 'activesupport', version
|
5
|
-
end
|
6
|
-
|
7
|
-
appraise "rails30" do
|
8
|
-
version = "3.0.20"
|
9
|
-
gem 'activerecord', version
|
10
|
-
gem 'activesupport', version
|
11
|
-
end
|
12
|
-
|
13
|
-
appraise "rails32" do
|
14
|
-
version = "3.2.13"
|
15
|
-
gem 'activerecord', version
|
16
|
-
gem 'activesupport', version
|
17
|
-
end
|
18
|
-
|
19
|
-
appraise "rails4" do
|
20
|
-
version = "4.0.0"
|
21
|
-
gem 'activerecord', version
|
22
|
-
gem 'activesupport', version
|
23
|
-
end
|
data/Gemfile
DELETED
data/Gemfile.lock
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
soft_deletion (0.5.6)
|
5
|
-
|
6
|
-
GEM
|
7
|
-
remote: https://rubygems.org/
|
8
|
-
specs:
|
9
|
-
activemodel (3.2.7)
|
10
|
-
activesupport (= 3.2.7)
|
11
|
-
builder (~> 3.0.0)
|
12
|
-
activerecord (3.2.7)
|
13
|
-
activemodel (= 3.2.7)
|
14
|
-
activesupport (= 3.2.7)
|
15
|
-
arel (~> 3.0.2)
|
16
|
-
tzinfo (~> 0.3.29)
|
17
|
-
activesupport (3.2.7)
|
18
|
-
i18n (~> 0.6)
|
19
|
-
multi_json (~> 1.0)
|
20
|
-
appraisal (0.4.1)
|
21
|
-
bundler
|
22
|
-
rake
|
23
|
-
arel (3.0.2)
|
24
|
-
builder (3.0.0)
|
25
|
-
bump (0.3.8)
|
26
|
-
database_cleaner (1.0.0.RC1)
|
27
|
-
diff-lcs (1.1.3)
|
28
|
-
i18n (0.6.0)
|
29
|
-
multi_json (1.3.6)
|
30
|
-
rake (0.9.2.2)
|
31
|
-
rspec (2.11.0)
|
32
|
-
rspec-core (~> 2.11.0)
|
33
|
-
rspec-expectations (~> 2.11.0)
|
34
|
-
rspec-mocks (~> 2.11.0)
|
35
|
-
rspec-core (2.11.1)
|
36
|
-
rspec-expectations (2.11.3)
|
37
|
-
diff-lcs (~> 1.1.3)
|
38
|
-
rspec-mocks (2.11.3)
|
39
|
-
sqlite3 (1.3.6)
|
40
|
-
tzinfo (0.3.33)
|
41
|
-
|
42
|
-
PLATFORMS
|
43
|
-
ruby
|
44
|
-
|
45
|
-
DEPENDENCIES
|
46
|
-
activerecord
|
47
|
-
activesupport
|
48
|
-
appraisal
|
49
|
-
bump
|
50
|
-
database_cleaner (= 1.0.0.RC1)
|
51
|
-
rake
|
52
|
-
rspec
|
53
|
-
soft_deletion!
|
54
|
-
sqlite3
|
data/MIT-LICENSE
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
Copyright (c) NOW-PRESENT Zendesk
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
-
a copy of this software and associated documentation files (the
|
5
|
-
"Software"), to deal in the Software without restriction, including
|
6
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
-
permit persons to whom the Software is furnished to do so, subject to
|
9
|
-
the following conditions:
|
10
|
-
|
11
|
-
The above copyright notice and this permission notice shall be
|
12
|
-
included in all copies or substantial portions of the Software.
|
13
|
-
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
require 'bundler/setup'
|
2
|
-
require 'appraisal'
|
3
|
-
require 'bundler/gem_tasks'
|
4
|
-
require 'rspec/core/rake_task'
|
5
|
-
require 'bump/tasks'
|
6
|
-
|
7
|
-
task :default do
|
8
|
-
sh "bundle exec rake appraisal:install && bundle exec rake appraisal spec"
|
9
|
-
end
|
10
|
-
|
11
|
-
RSpec::Core::RakeTask.new(:spec)
|
data/gem-public_cert.pem
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
-----BEGIN CERTIFICATE-----
|
2
|
-
MIIDMjCCAhqgAwIBAgIBADANBgkqhkiG9w0BAQUFADA/MRAwDgYDVQQDDAdtaWNo
|
3
|
-
YWVsMRcwFQYKCZImiZPyLGQBGRYHZ3Jvc3NlcjESMBAGCgmSJomT8ixkARkWAml0
|
4
|
-
MB4XDTEzMDIwMzE4MTMxMVoXDTE0MDIwMzE4MTMxMVowPzEQMA4GA1UEAwwHbWlj
|
5
|
-
aGFlbDEXMBUGCgmSJomT8ixkARkWB2dyb3NzZXIxEjAQBgoJkiaJk/IsZAEZFgJp
|
6
|
-
dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMorXo/hgbUq97+kII9H
|
7
|
-
MsQcLdC/7wQ1ZP2OshVHPkeP0qH8MBHGg6eYisOX2ubNagF9YTCZWnhrdKrwpLOO
|
8
|
-
cPLaZbjUjljJ3cQR3B8Yn1veV5IhG86QseTBjymzJWsLpqJ1UZGpfB9tXcsFtuxO
|
9
|
-
6vHvcIHdzvc/OUkICttLbH+1qb6rsHUceqh+JrH4GrsJ5H4hAfIdyS2XMK7YRKbh
|
10
|
-
h+IBu6dFWJJByzFsYmV1PDXln3UBmgAt65cmCu4qPfThioCGDzbSJrGDGLmw/pFX
|
11
|
-
FPpVCm1zgYSb1v6Qnf3cgXa2f2wYGm17+zAVyIDpwryFru9yF/jJxE38z/DRsd9R
|
12
|
-
/88CAwEAAaM5MDcwCQYDVR0TBAIwADAdBgNVHQ4EFgQUsiNnXHtKeMYYcr4yJVmQ
|
13
|
-
WONL+IwwCwYDVR0PBAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQAlyN7kKo/NQCQ0
|
14
|
-
AOzZLZ3WAePvStkCFIJ53tsv5Kyo4pMAllv+BgPzzBt7qi605mFSL6zBd9uLou+W
|
15
|
-
Co3s48p1dy7CjjAfVQdmVNHF3MwXtfC2OEyvSQPi4xKR8iba8wa3xp9LVo1PuLpw
|
16
|
-
/6DsrChWw74HfsJN6qJOK684hJeT8lBYAUfiC3wD0owoPSg+XtyAAddisR+KV5Y1
|
17
|
-
NmVHuLtQcNTZy+gRht3ahJRMuC6QyLmkTsf+6MaenwAMkAgHdswGsJztOnNnBa3F
|
18
|
-
y0kCSWmK6D+x/SbfS6r7Ke07MRqziJdB9GuE1+0cIRuFh8EQ+LN6HXCKM5pon/GU
|
19
|
-
ycwMXfl0
|
20
|
-
-----END CERTIFICATE-----
|
data/gemfiles/rails2.gemfile
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "appraisal"
|
6
|
-
gem "rake"
|
7
|
-
gem "sqlite3"
|
8
|
-
gem "rspec"
|
9
|
-
gem "database_cleaner", "1.0.0.RC1"
|
10
|
-
gem "bump"
|
11
|
-
gem "activerecord", "2.3.18"
|
12
|
-
gem "activesupport", "2.3.18"
|
13
|
-
|
14
|
-
gemspec :path=>"../"
|
data/gemfiles/rails3.gemfile
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "appraisal"
|
6
|
-
gem "rake"
|
7
|
-
gem "sqlite3"
|
8
|
-
gem "rspec"
|
9
|
-
gem "database_cleaner", "1.0.0.RC1"
|
10
|
-
gem "bump"
|
11
|
-
gem "activerecord", "3.2.3"
|
12
|
-
gem "activesupport", "3.2.3"
|
13
|
-
|
14
|
-
gemspec :path=>"../"
|
data/gemfiles/rails30.gemfile
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "appraisal"
|
6
|
-
gem "rake"
|
7
|
-
gem "sqlite3"
|
8
|
-
gem "rspec"
|
9
|
-
gem "database_cleaner", "1.0.0.RC1"
|
10
|
-
gem "bump"
|
11
|
-
gem "activerecord", "3.0.20"
|
12
|
-
gem "activesupport", "3.0.20"
|
13
|
-
|
14
|
-
gemspec :path=>"../"
|
data/gemfiles/rails32.gemfile
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "appraisal"
|
6
|
-
gem "rake"
|
7
|
-
gem "sqlite3"
|
8
|
-
gem "rspec"
|
9
|
-
gem "database_cleaner", "1.0.0.RC1"
|
10
|
-
gem "bump"
|
11
|
-
gem "activerecord", "3.2.13"
|
12
|
-
gem "activesupport", "3.2.13"
|
13
|
-
|
14
|
-
gemspec :path=>"../"
|
data/gemfiles/rails4.gemfile
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
# This file was generated by Appraisal
|
2
|
-
|
3
|
-
source "https://rubygems.org"
|
4
|
-
|
5
|
-
gem "appraisal"
|
6
|
-
gem "rake"
|
7
|
-
gem "sqlite3"
|
8
|
-
gem "rspec"
|
9
|
-
gem "database_cleaner", "1.0.0.RC1"
|
10
|
-
gem "bump"
|
11
|
-
gem "activerecord", "4.0.0"
|
12
|
-
gem "activesupport", "4.0.0"
|
13
|
-
|
14
|
-
gemspec :path=>"../"
|
data/soft_deletion.gemspec
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
$LOAD_PATH.unshift File.expand_path("../lib", __FILE__)
|
2
|
-
name = "soft_deletion"
|
3
|
-
require "#{name}/version"
|
4
|
-
|
5
|
-
Gem::Specification.new name, SoftDeletion::VERSION do |s|
|
6
|
-
s.summary = "Explicit soft deletion for ActiveRecord via deleted_at and default scope."
|
7
|
-
s.authors = ["Zendesk"]
|
8
|
-
s.email = "michael@grosser.it"
|
9
|
-
s.homepage = "https://github.com/grosser/#{name}"
|
10
|
-
s.files = `git ls-files`.split("\n")
|
11
|
-
s.license = "MIT"
|
12
|
-
key = File.expand_path("~/.ssh/gem-private_key.pem")
|
13
|
-
if File.exist?(key)
|
14
|
-
s.signing_key = key
|
15
|
-
s.cert_chain = ["gem-public_cert.pem"]
|
16
|
-
end
|
17
|
-
end
|
data/spec/soft_deletion_spec.rb
DELETED
@@ -1,510 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe SoftDeletion do
|
4
|
-
def self.successfully_soft_deletes
|
5
|
-
context "successfully soft deleted" do
|
6
|
-
before do
|
7
|
-
@category.soft_delete!
|
8
|
-
end
|
9
|
-
|
10
|
-
it "should mark itself as deleted" do
|
11
|
-
@category.reload
|
12
|
-
@category.should be_deleted
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should soft delete its dependent associations" do
|
16
|
-
@forum.reload
|
17
|
-
@forum.should be_deleted
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.successfully_bulk_soft_deletes
|
23
|
-
context "successfully bulk soft deleted" do
|
24
|
-
before do
|
25
|
-
Category.soft_delete_all!(@category)
|
26
|
-
end
|
27
|
-
|
28
|
-
it "should mark itself as deleted" do
|
29
|
-
@category.reload
|
30
|
-
@category.should be_deleted
|
31
|
-
end
|
32
|
-
|
33
|
-
it "should soft delete its dependent associations" do
|
34
|
-
@forum.reload
|
35
|
-
@forum.should be_deleted
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
before do
|
41
|
-
clear_callbacks Category, :soft_delete
|
42
|
-
clear_callbacks Category, :soft_undelete
|
43
|
-
|
44
|
-
# Stub dump method calls
|
45
|
-
Category.any_instance.stub(:foo)
|
46
|
-
Category.any_instance.stub(:bar)
|
47
|
-
end
|
48
|
-
|
49
|
-
describe "callbacks" do
|
50
|
-
describe ".before_soft_delete" do
|
51
|
-
it "is called on soft-deletion" do
|
52
|
-
Category.before_soft_delete :foo
|
53
|
-
category = Category.create!
|
54
|
-
|
55
|
-
category.should_receive(:foo)
|
56
|
-
|
57
|
-
category.soft_delete!
|
58
|
-
end
|
59
|
-
|
60
|
-
it "stops execution chain if false is returned" do
|
61
|
-
Category.before_soft_delete :foo, :bar
|
62
|
-
category = Category.create!
|
63
|
-
|
64
|
-
category.should_receive(:foo).and_return(false)
|
65
|
-
category.should_not_receive(:bar)
|
66
|
-
|
67
|
-
category.soft_delete!.should == false
|
68
|
-
category.reload
|
69
|
-
category.should_not be_deleted
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
describe ".after_soft_delete" do
|
74
|
-
it "is called after soft-deletion" do
|
75
|
-
Category.after_soft_delete :foo
|
76
|
-
category = Category.create!
|
77
|
-
|
78
|
-
category.should_receive(:foo)
|
79
|
-
|
80
|
-
category.soft_delete!
|
81
|
-
end
|
82
|
-
|
83
|
-
it "is called after bulk soft-deletion" do
|
84
|
-
Category.after_soft_delete :foo
|
85
|
-
category = Category.create!
|
86
|
-
|
87
|
-
category.should_receive(:foo)
|
88
|
-
|
89
|
-
Category.soft_delete_all!(category)
|
90
|
-
end
|
91
|
-
|
92
|
-
it "is called with a block" do
|
93
|
-
Category.after_soft_delete{|c| c.foo }
|
94
|
-
category = Category.create!
|
95
|
-
|
96
|
-
category.should_receive(:foo)
|
97
|
-
|
98
|
-
category.soft_delete!
|
99
|
-
end
|
100
|
-
|
101
|
-
it "calls multiple after soft-deletion" do
|
102
|
-
Category.after_soft_delete :foo, :bar
|
103
|
-
category = Category.create!
|
104
|
-
|
105
|
-
category.should_receive(:foo)
|
106
|
-
category.should_receive(:bar)
|
107
|
-
|
108
|
-
category.soft_delete!
|
109
|
-
end
|
110
|
-
|
111
|
-
it "does not stop deletion when returning false" do
|
112
|
-
Category.after_soft_delete :foo
|
113
|
-
category = Category.create!
|
114
|
-
|
115
|
-
category.should_receive(:foo).and_return false
|
116
|
-
|
117
|
-
category.soft_delete!
|
118
|
-
|
119
|
-
category.reload
|
120
|
-
category.should be_deleted
|
121
|
-
end
|
122
|
-
|
123
|
-
it "is not called after normal destroy" do
|
124
|
-
Category.after_soft_delete :foo
|
125
|
-
category = Category.create!
|
126
|
-
|
127
|
-
category.should_not_receive(:foo)
|
128
|
-
|
129
|
-
category.destroy
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
describe ".before_soft_undelete" do
|
134
|
-
it "is called on soft-undeletion" do
|
135
|
-
Category.before_soft_undelete :foo
|
136
|
-
category = Category.create!(:deleted_at => Time.now)
|
137
|
-
|
138
|
-
category.should_receive(:foo)
|
139
|
-
|
140
|
-
category.soft_undelete!
|
141
|
-
end
|
142
|
-
|
143
|
-
it "stops execution chain if false is returned" do
|
144
|
-
Category.before_soft_undelete :foo, :bar
|
145
|
-
category = Category.create!(:deleted_at => Time.now)
|
146
|
-
|
147
|
-
category.should_receive(:foo).and_return(false)
|
148
|
-
category.should_not_receive(:bar)
|
149
|
-
|
150
|
-
category.soft_undelete!.should == false
|
151
|
-
category.reload
|
152
|
-
category.should be_deleted
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
describe ".after_soft_undelete" do
|
157
|
-
it "is called after soft-undeletion" do
|
158
|
-
Category.after_soft_undelete :foo
|
159
|
-
category = Category.create!(:deleted_at => Time.now)
|
160
|
-
|
161
|
-
category.should_receive(:foo)
|
162
|
-
|
163
|
-
category.soft_undelete!
|
164
|
-
end
|
165
|
-
|
166
|
-
it "is called with a block" do
|
167
|
-
Category.after_soft_undelete{|c| c.foo }
|
168
|
-
category = Category.create!(:deleted_at => Time.now)
|
169
|
-
|
170
|
-
category.should_receive(:foo)
|
171
|
-
|
172
|
-
category.soft_undelete!
|
173
|
-
end
|
174
|
-
|
175
|
-
it "calls multiple after soft-undeletion" do
|
176
|
-
Category.after_soft_undelete :foo, :bar
|
177
|
-
category = Category.create!(:deleted_at => Time.now)
|
178
|
-
|
179
|
-
category.should_receive(:foo)
|
180
|
-
category.should_receive(:bar)
|
181
|
-
|
182
|
-
category.soft_undelete!
|
183
|
-
end
|
184
|
-
|
185
|
-
it "does not stop undeletion when returning false" do
|
186
|
-
Category.after_soft_undelete :foo
|
187
|
-
category = Category.create!(:deleted_at => Time.now)
|
188
|
-
|
189
|
-
category.should_receive(:foo).and_return false
|
190
|
-
|
191
|
-
category.soft_undelete!
|
192
|
-
|
193
|
-
category.reload
|
194
|
-
category.should_not be_deleted
|
195
|
-
end
|
196
|
-
|
197
|
-
it "is not called after normal destroy" do
|
198
|
-
Category.after_soft_undelete :foo
|
199
|
-
category = Category.create!(:deleted_at => Time.now)
|
200
|
-
|
201
|
-
category.should_not_receive(:foo)
|
202
|
-
|
203
|
-
category.destroy
|
204
|
-
end
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
describe "association" do
|
209
|
-
context "without dependent associations" do
|
210
|
-
it "should only soft-delete itself" do
|
211
|
-
category = NACategory.create!
|
212
|
-
category.soft_delete!
|
213
|
-
|
214
|
-
category.reload
|
215
|
-
category.should be_deleted
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
context "with independent associations" do
|
220
|
-
it "should not delete associations" do
|
221
|
-
category = IDACategory.create!
|
222
|
-
forum = category.forums.create!
|
223
|
-
category.soft_delete!
|
224
|
-
|
225
|
-
forum.reload
|
226
|
-
forum.should be_deleted
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
context "with dependent has_one association" do
|
231
|
-
before do
|
232
|
-
@category = HOACategory.create!
|
233
|
-
@forum = @category.create_forum
|
234
|
-
end
|
235
|
-
|
236
|
-
successfully_soft_deletes
|
237
|
-
successfully_bulk_soft_deletes
|
238
|
-
end
|
239
|
-
|
240
|
-
context "with dependent association that doesn't have soft deletion" do
|
241
|
-
before do
|
242
|
-
@category = DACategory.create!
|
243
|
-
@forum = @category.destroyable_forums.create!
|
244
|
-
end
|
245
|
-
|
246
|
-
context "successfully soft deleted" do
|
247
|
-
before do
|
248
|
-
@category.soft_delete!
|
249
|
-
end
|
250
|
-
|
251
|
-
it "should mark itself as deleted" do
|
252
|
-
@category.reload
|
253
|
-
@category.should be_deleted
|
254
|
-
end
|
255
|
-
|
256
|
-
it "should not destroy dependent association" do
|
257
|
-
DestroyableForum.exists?(@forum.id).should be_true
|
258
|
-
end
|
259
|
-
end
|
260
|
-
end
|
261
|
-
|
262
|
-
context "with dependent has_many associations" do
|
263
|
-
before do
|
264
|
-
@category = Category.create!
|
265
|
-
@forum = @category.forums.create!
|
266
|
-
end
|
267
|
-
|
268
|
-
context "failing to soft delete" do
|
269
|
-
before do
|
270
|
-
@category.stub(:valid?).and_return(false)
|
271
|
-
expect{ @category.soft_delete! }.to raise_error(ActiveRecord::RecordInvalid)
|
272
|
-
end
|
273
|
-
|
274
|
-
it "should not mark itself as deleted" do
|
275
|
-
@category.reload
|
276
|
-
@category.should_not be_deleted
|
277
|
-
end
|
278
|
-
|
279
|
-
it "should not soft delete its dependent associations" do
|
280
|
-
@forum.reload
|
281
|
-
@forum.should_not be_deleted
|
282
|
-
end
|
283
|
-
end
|
284
|
-
|
285
|
-
successfully_soft_deletes
|
286
|
-
successfully_bulk_soft_deletes
|
287
|
-
|
288
|
-
context "being restored from soft deletion" do
|
289
|
-
def undelete!
|
290
|
-
Category.with_deleted do
|
291
|
-
@category.reload
|
292
|
-
@category.soft_undelete!
|
293
|
-
end
|
294
|
-
end
|
295
|
-
|
296
|
-
before do
|
297
|
-
@category.soft_delete!
|
298
|
-
Category.with_deleted { @category = Category.find(@category.id) }
|
299
|
-
end
|
300
|
-
|
301
|
-
it "does not mark itself as deleted" do
|
302
|
-
undelete!
|
303
|
-
@category.reload
|
304
|
-
@category.should_not be_deleted
|
305
|
-
end
|
306
|
-
|
307
|
-
it "restores its dependent associations" do
|
308
|
-
undelete!
|
309
|
-
@forum.reload
|
310
|
-
@forum.should_not be_deleted
|
311
|
-
end
|
312
|
-
|
313
|
-
it "does not fail if dependent associations are not deleted" do
|
314
|
-
@forum.reload.soft_undelete!
|
315
|
-
undelete!
|
316
|
-
@forum.reload
|
317
|
-
@forum.should_not be_deleted
|
318
|
-
end
|
319
|
-
|
320
|
-
it "does not restore far previous deletions" do
|
321
|
-
@forum.update_attributes(:deleted_at => 1.year.ago)
|
322
|
-
undelete!
|
323
|
-
@forum.reload.should be_deleted
|
324
|
-
end
|
325
|
-
end
|
326
|
-
end
|
327
|
-
|
328
|
-
context "a soft-deleted has-many category that nullifies forum references on delete" do
|
329
|
-
it "should nullify those references" do
|
330
|
-
category = NDACategory.create!
|
331
|
-
forum = category.forums.create!
|
332
|
-
category.soft_delete!
|
333
|
-
|
334
|
-
forum.reload
|
335
|
-
forum.should_not be_deleted
|
336
|
-
forum.category_id.should be_nil
|
337
|
-
end
|
338
|
-
end
|
339
|
-
|
340
|
-
context "a soft-deleted has-many category that delete_all forum references on delete" do
|
341
|
-
it "use update_all to delete references" do
|
342
|
-
category = DDACategory.create!
|
343
|
-
forum = category.forums.create!
|
344
|
-
category.soft_delete!
|
345
|
-
|
346
|
-
forum.should_not be_deleted # just did an update_all
|
347
|
-
Forum.find(forum.id).should be_deleted
|
348
|
-
end
|
349
|
-
|
350
|
-
it "custom sql to delete all" do
|
351
|
-
category = DDACategory.create!
|
352
|
-
forum = category.forums.create!
|
353
|
-
Forum.should_receive(:mark_as_soft_deleted_sql).and_return "fooo"
|
354
|
-
category.forums.should_receive(:update_all).with("fooo")
|
355
|
-
category.soft_delete!
|
356
|
-
end
|
357
|
-
end
|
358
|
-
|
359
|
-
context "a soft-deleted has-many category that defaults dependent forum references on delete" do
|
360
|
-
it "does nothing to those references" do
|
361
|
-
category = XDACategory.create!
|
362
|
-
forum = category.forums.create!
|
363
|
-
category.soft_delete!
|
364
|
-
|
365
|
-
forum.reload
|
366
|
-
forum.should_not be_deleted
|
367
|
-
forum.category_id.should_not be_nil
|
368
|
-
end
|
369
|
-
end
|
370
|
-
|
371
|
-
context "a soft-deleted has-many category that nullifies forum references on delete without foreign_key" do
|
372
|
-
it "should nullify those references" do
|
373
|
-
organization = Organization.create!
|
374
|
-
forum = organization.forums.create!
|
375
|
-
organization.soft_delete!
|
376
|
-
|
377
|
-
forum.reload
|
378
|
-
forum.should_not be_deleted
|
379
|
-
forum.organization_id.should be_nil
|
380
|
-
end
|
381
|
-
end
|
382
|
-
end
|
383
|
-
|
384
|
-
context "without deleted_at column" do
|
385
|
-
it "does not provoke an error" do
|
386
|
-
expect do
|
387
|
-
OriginalCategory.create!
|
388
|
-
end.to_not raise_error
|
389
|
-
end
|
390
|
-
end
|
391
|
-
|
392
|
-
context "default_scope" do
|
393
|
-
let(:forum) do
|
394
|
-
# create! does not work on rails 2
|
395
|
-
f = Cat2Forum.new
|
396
|
-
f.deleted_at = Time.now
|
397
|
-
f.save!
|
398
|
-
f
|
399
|
-
end
|
400
|
-
|
401
|
-
it "prevents find when deleted" do
|
402
|
-
Cat2Forum.find_by_id(forum.id).should == nil
|
403
|
-
end
|
404
|
-
|
405
|
-
it "can find without deleted" do
|
406
|
-
forum.update_attributes(:deleted_at => nil)
|
407
|
-
Cat2Forum.find_by_id(forum.id).should_not == nil
|
408
|
-
end
|
409
|
-
end
|
410
|
-
|
411
|
-
describe ".soft_delete_all!" do
|
412
|
-
before do
|
413
|
-
@categories = 2.times.map { Category.create! }
|
414
|
-
end
|
415
|
-
|
416
|
-
context "by id" do
|
417
|
-
before do
|
418
|
-
Category.soft_delete_all!(@categories.map(&:id))
|
419
|
-
end
|
420
|
-
|
421
|
-
it "should delete all models" do
|
422
|
-
@categories.each do |category|
|
423
|
-
category.reload
|
424
|
-
category.should be_deleted
|
425
|
-
end
|
426
|
-
end
|
427
|
-
end
|
428
|
-
|
429
|
-
context "by model" do
|
430
|
-
before do
|
431
|
-
Category.soft_delete_all!(@categories)
|
432
|
-
end
|
433
|
-
|
434
|
-
it "should delete all models" do
|
435
|
-
@categories.each do |category|
|
436
|
-
category.reload
|
437
|
-
category.should be_deleted
|
438
|
-
end
|
439
|
-
end
|
440
|
-
end
|
441
|
-
end
|
442
|
-
|
443
|
-
describe "overwritten default scope" do
|
444
|
-
it "should find even with deleted_at" do
|
445
|
-
forum = Cat1Forum.create(:deleted_at => Time.now)
|
446
|
-
|
447
|
-
Cat1Forum.find_by_id(forum.id).should_not be_nil
|
448
|
-
end
|
449
|
-
|
450
|
-
it "should not find by new scope" do
|
451
|
-
# create! does not work here on rails 2
|
452
|
-
forum = Cat1Forum.new
|
453
|
-
forum.category_id = 2
|
454
|
-
forum.save!
|
455
|
-
|
456
|
-
Cat1Forum.find_by_id(forum.id).should be_nil
|
457
|
-
end
|
458
|
-
end
|
459
|
-
|
460
|
-
describe "validations" do
|
461
|
-
it "should fail when validations fail" do
|
462
|
-
forum = ValidatedForum.create!(:category_id => 1)
|
463
|
-
forum.category_id = nil
|
464
|
-
|
465
|
-
expect do
|
466
|
-
forum.soft_delete!
|
467
|
-
end.to raise_error(ActiveRecord::RecordInvalid)
|
468
|
-
|
469
|
-
forum.reload
|
470
|
-
forum.should_not be_deleted
|
471
|
-
end
|
472
|
-
|
473
|
-
it "should pass when validations pass" do
|
474
|
-
forum = ValidatedForum.create!(:category_id => 1)
|
475
|
-
forum.soft_delete!
|
476
|
-
|
477
|
-
forum.reload
|
478
|
-
forum.should be_deleted
|
479
|
-
end
|
480
|
-
end
|
481
|
-
|
482
|
-
describe "#soft_delete" do
|
483
|
-
it "should return true if it succeeds" do
|
484
|
-
forum = ValidatedForum.create!(:category_id => 1)
|
485
|
-
|
486
|
-
forum.soft_delete.should be_true
|
487
|
-
forum.reload
|
488
|
-
forum.should be_deleted
|
489
|
-
end
|
490
|
-
|
491
|
-
it "should return false if validations fail" do
|
492
|
-
forum = ValidatedForum.create!(:category_id => 1)
|
493
|
-
forum.category_id = nil
|
494
|
-
|
495
|
-
forum.soft_delete.should be_false
|
496
|
-
forum.reload
|
497
|
-
forum.should_not be_deleted
|
498
|
-
end
|
499
|
-
|
500
|
-
it "should return true if validations are prevented and it succeeds" do
|
501
|
-
forum = ValidatedForum.create!(:category_id => 1)
|
502
|
-
forum.category_id = nil
|
503
|
-
skip_validations = (ActiveRecord::VERSION::MAJOR == 2 ? false : {:validate => false})
|
504
|
-
|
505
|
-
forum.soft_delete(skip_validations).should be_true
|
506
|
-
forum.reload
|
507
|
-
forum.should be_deleted
|
508
|
-
end
|
509
|
-
end
|
510
|
-
end
|
data/spec/spec_helper.rb
DELETED
@@ -1,194 +0,0 @@
|
|
1
|
-
require 'active_record'
|
2
|
-
require 'soft_deletion'
|
3
|
-
require 'database_cleaner'
|
4
|
-
require 'logger'
|
5
|
-
|
6
|
-
# ActiveRecord::Base.logger = Logger.new(STDOUT) # for easier debugging
|
7
|
-
|
8
|
-
RSpec.configure do |config|
|
9
|
-
config.before(:suite) do
|
10
|
-
# would be nicer to use transaction, but Rails 2 does not open a new transaction or savepoint
|
11
|
-
# when already inside a transaction
|
12
|
-
DatabaseCleaner.strategy = :truncation
|
13
|
-
end
|
14
|
-
|
15
|
-
config.before do
|
16
|
-
DatabaseCleaner.start
|
17
|
-
end
|
18
|
-
|
19
|
-
config.after do
|
20
|
-
DatabaseCleaner.clean
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def clear_callbacks(model, callback)
|
25
|
-
if ActiveRecord::VERSION::MAJOR > 2
|
26
|
-
model.reset_callbacks callback
|
27
|
-
else
|
28
|
-
model.class_eval do
|
29
|
-
instance_variable_set "@before_#{callback}_callbacks", nil
|
30
|
-
instance_variable_set "@after_#{callback}_callbacks", nil
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
# connect
|
36
|
-
ActiveRecord::Base.establish_connection(
|
37
|
-
:adapter => "sqlite3",
|
38
|
-
:database => ":memory:"
|
39
|
-
)
|
40
|
-
|
41
|
-
# create tables
|
42
|
-
ActiveRecord::Schema.verbose = false
|
43
|
-
ActiveRecord::Schema.define(:version => 1) do
|
44
|
-
create_table :forums do |t|
|
45
|
-
t.integer :category_id
|
46
|
-
t.integer :organization_id
|
47
|
-
t.timestamp :deleted_at
|
48
|
-
end
|
49
|
-
|
50
|
-
create_table :categories do |t|
|
51
|
-
t.timestamp :deleted_at
|
52
|
-
end
|
53
|
-
|
54
|
-
create_table :original_categories do |t|
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
class ActiveRecord::Base
|
59
|
-
def self.silent_set_table_name(name)
|
60
|
-
if ActiveRecord::VERSION::MAJOR > 2
|
61
|
-
self.table_name = name
|
62
|
-
else
|
63
|
-
set_table_name name
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# setup models
|
69
|
-
|
70
|
-
class Forum < ActiveRecord::Base
|
71
|
-
has_soft_deletion
|
72
|
-
|
73
|
-
belongs_to :category
|
74
|
-
end
|
75
|
-
|
76
|
-
class ValidatedForum < ActiveRecord::Base
|
77
|
-
silent_set_table_name 'forums'
|
78
|
-
|
79
|
-
has_soft_deletion
|
80
|
-
|
81
|
-
belongs_to :category
|
82
|
-
validates_presence_of :category_id
|
83
|
-
end
|
84
|
-
|
85
|
-
class Category < ActiveRecord::Base
|
86
|
-
has_soft_deletion
|
87
|
-
|
88
|
-
has_many :forums, :dependent => :destroy
|
89
|
-
end
|
90
|
-
|
91
|
-
class Organization < ActiveRecord::Base
|
92
|
-
silent_set_table_name 'categories'
|
93
|
-
has_soft_deletion
|
94
|
-
|
95
|
-
has_many :forums, :dependent => :nullify
|
96
|
-
end
|
97
|
-
|
98
|
-
|
99
|
-
# No association
|
100
|
-
class NACategory < ActiveRecord::Base
|
101
|
-
silent_set_table_name 'categories'
|
102
|
-
|
103
|
-
has_soft_deletion
|
104
|
-
end
|
105
|
-
|
106
|
-
# Independent association
|
107
|
-
class IDACategory < ActiveRecord::Base
|
108
|
-
silent_set_table_name 'categories'
|
109
|
-
|
110
|
-
has_soft_deletion
|
111
|
-
|
112
|
-
has_many :forums, :dependent => :destroy, :foreign_key => :category_id
|
113
|
-
end
|
114
|
-
|
115
|
-
# Nullified dependent association
|
116
|
-
class NDACategory < ActiveRecord::Base
|
117
|
-
silent_set_table_name 'categories'
|
118
|
-
|
119
|
-
has_soft_deletion
|
120
|
-
|
121
|
-
has_many :forums, :dependent => :nullify, :foreign_key => :category_id
|
122
|
-
end
|
123
|
-
|
124
|
-
# Delete dependent association
|
125
|
-
class DDACategory < ActiveRecord::Base
|
126
|
-
silent_set_table_name 'categories'
|
127
|
-
|
128
|
-
has_soft_deletion
|
129
|
-
|
130
|
-
has_many :forums, :dependent => :delete_all, :foreign_key => :category_id
|
131
|
-
end
|
132
|
-
|
133
|
-
# default dependent association
|
134
|
-
class XDACategory < ActiveRecord::Base
|
135
|
-
silent_set_table_name 'categories'
|
136
|
-
|
137
|
-
has_soft_deletion
|
138
|
-
|
139
|
-
has_many :forums, :foreign_key => :category_id
|
140
|
-
end
|
141
|
-
|
142
|
-
# Has ome association
|
143
|
-
class HOACategory < ActiveRecord::Base
|
144
|
-
silent_set_table_name 'categories'
|
145
|
-
|
146
|
-
has_soft_deletion
|
147
|
-
|
148
|
-
has_one :forum, :dependent => :destroy, :foreign_key => :category_id
|
149
|
-
end
|
150
|
-
|
151
|
-
# Class without column deleted_at
|
152
|
-
class OriginalCategory < ActiveRecord::Base
|
153
|
-
has_soft_deletion
|
154
|
-
end
|
155
|
-
|
156
|
-
# Has many destroyable association
|
157
|
-
class DACategory < ActiveRecord::Base
|
158
|
-
silent_set_table_name 'categories'
|
159
|
-
|
160
|
-
has_soft_deletion
|
161
|
-
|
162
|
-
has_many :destroyable_forums, :dependent => :destroy, :foreign_key => :category_id
|
163
|
-
end
|
164
|
-
|
165
|
-
# Forum that isn't soft deletable for association checking
|
166
|
-
class DestroyableForum < ActiveRecord::Base
|
167
|
-
silent_set_table_name 'forums'
|
168
|
-
end
|
169
|
-
|
170
|
-
# test that it does not blow up when the table is not yet defined (e.g. in rake db:reset)
|
171
|
-
class NoTable < ActiveRecord::Base
|
172
|
-
has_soft_deletion
|
173
|
-
end
|
174
|
-
|
175
|
-
# Forum with other default scope
|
176
|
-
class Cat1Forum < ActiveRecord::Base
|
177
|
-
silent_set_table_name 'forums'
|
178
|
-
|
179
|
-
has_soft_deletion
|
180
|
-
if ActiveRecord::VERSION::MAJOR >= 4
|
181
|
-
default_scope { where(:category_id => 1) }
|
182
|
-
else
|
183
|
-
default_scope :conditions => {:category_id => 1}
|
184
|
-
end
|
185
|
-
|
186
|
-
belongs_to :category
|
187
|
-
end
|
188
|
-
|
189
|
-
class Cat2Forum < ActiveRecord::Base
|
190
|
-
silent_set_table_name 'forums'
|
191
|
-
|
192
|
-
has_soft_deletion :default_scope => true
|
193
|
-
end
|
194
|
-
|