winton-acts_as_archive 0.1.0 → 0.1.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.
data/README.markdown CHANGED
@@ -1,23 +1,73 @@
1
- GemTemplate
2
- ===========
1
+ ActsAsArchive
2
+ =============
3
3
 
4
- A gem template for new projects.
4
+ Don't delete your records, move them to a different table.
5
+ Like <code>acts\_as\_paranoid</code>, but doesn't change all your SQL queries.
5
6
 
6
- Setup
7
- -----
7
+ Install
8
+ -------
9
+
10
+ script/plugin:
11
+
12
+ <pre>
13
+ script/plugin install git://github.com/winton/acts_as_archive.git
14
+ </pre>
15
+
16
+ rubygems:
8
17
 
9
18
  <pre>
10
- git clone git://github.com/winton/acts_as_archive.git my_project
11
- cd my_project
12
- rm -Rf .git
13
- git init
14
- git remote add origin git@github.com:winton/my_project.git
19
+ # terminal
20
+ sudo gem install winton-acts_as_archive
21
+
22
+ # environment.rb
23
+ config.gem "winton-acts_as_archive", :lib => "acts_as_archive", :source => "http://gems.github.com"
15
24
  </pre>
16
25
 
17
- Rename these files/folders:
26
+ Models
27
+ ------
28
+
29
+ Add <code>acts\_as\_archive</code> to your models:
18
30
 
19
31
  <pre>
20
- ls **/acts_as_archive*
32
+ class Article < ActiveRecord::Base
33
+ acts_as_archive
34
+ end
21
35
  </pre>
22
36
 
23
- Do a project-wide find/replace on <code>acts_as_archive</code>.
37
+ That's it!
38
+ ----------
39
+
40
+ Next time your Rails instance boots up, the plugin replicates your table's structure into
41
+ <code>archived\_articles</code> (as per the example), with an additional <code>deleted\_at</code> column.
42
+
43
+ Use <code>destroy</code>, <code>delete</code>, and <code>delete_all</code> like you normally would.
44
+ Records are copied into the archive table before being destroyed.
45
+
46
+ What if my schema changes?
47
+ --------------------------
48
+
49
+ Any new migrations on your <code>acts\_as\_archive</code> table are automatically applied to the archive table.
50
+
51
+ Query the archive
52
+ -----------------
53
+
54
+ Add <code>::Archive</code> to your ActiveRecord class:
55
+
56
+ <pre>
57
+ Article::Archive.find(:first)
58
+ </pre>
59
+
60
+ Restore from the archive
61
+ ------------------------
62
+
63
+ Use <code>restore\_all</code> to copy archived records back to your table:
64
+
65
+ <pre>
66
+ Article.restore_all([ 'id = ?', 1 ])
67
+ </pre>
68
+
69
+ Auto-migrate from acts\_as\_paranoid
70
+ ------------------------------------
71
+
72
+ If a <code>deleted\_at</code> column is present in your table, the plugin will attempt to move deleted
73
+ records to the archive table, preserving the <code>deleted\_at</code> value.
@@ -1,14 +1,14 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'acts_as_archive'
3
- s.version = '0.1.0'
4
- s.date = '2009-04-22'
3
+ s.version = '0.1.1'
4
+ s.date = '2009-04-23'
5
5
 
6
- s.summary = "Moves your deleted records to a different table"
7
- s.description = "Moves your deleted records to a different table"
6
+ s.summary = "Don't delete your records, move them to a different table"
7
+ s.description = "Don't delete your records, move them to a different table"
8
8
 
9
9
  s.author = 'Winton Welsh'
10
10
  s.email = 'mail@wintoni.us'
11
- s.homepage = 'http://github.com/winton/'
11
+ s.homepage = 'http://github.com/winton/acts_as_archive'
12
12
 
13
13
  # = MANIFEST =
14
14
  s.files = %w[
@@ -16,31 +16,30 @@ module ActsAsArchive
16
16
  end
17
17
 
18
18
  module ClassMethods
19
- def copy_to_archive(conditions)
19
+ def copy_to_archive(conditions, import=false)
20
20
  add_conditions!(where = '', conditions)
21
- col_names = column_names - [ 'deleted_at' ]
21
+ insert_cols = column_names.clone
22
+ select_cols = column_names.clone
23
+ if insert_cols.include?('deleted_at')
24
+ unless import
25
+ select_cols[select_cols.index('deleted_at')] = "'#{Time.now.to_s(:db)}'"
26
+ end
27
+ else
28
+ insert_cols << 'deleted_at'
29
+ select_cols << "'#{Time.now.to_s(:db)}'"
30
+ end
22
31
  connection.execute(%{
23
- INSERT INTO archived_#{table_name} (#{col_names.join(', ')}, deleted_at)
24
- SELECT #{col_names.join(', ')}, '#{Time.now.to_s(:db)}'
32
+ INSERT INTO archived_#{table_name} (#{insert_cols.join(', ')})
33
+ SELECT #{select_cols.join(', ')}
25
34
  FROM #{table_name}
26
35
  #{where}
27
36
  })
28
- if where.empty?
29
- connection.execute("TRUNCATE TABLE #{table_name}")
30
- else
31
- connection.execute("DELETE FROM #{table_name} #{where}")
32
- end
37
+ connection.execute("DELETE FROM #{table_name} #{where}")
33
38
  end
34
39
 
35
40
  def delete_all(conditions=nil)
36
41
  copy_to_archive(conditions)
37
42
  end
38
-
39
- def migrate_from_acts_as_paranoid
40
- if column_names.include?('deleted_at')
41
- copy_to_archive('deleted_at IS NOT NULL')
42
- end
43
- end
44
43
  end
45
44
 
46
45
  module InstanceMethods
@@ -19,11 +19,7 @@ module ActsAsArchive
19
19
  FROM archived_#{table_name}
20
20
  #{where}
21
21
  })
22
- if where.empty?
23
- connection.execute("TRUNCATE TABLE archived_#{table_name}")
24
- else
25
- connection.execute("DELETE FROM archived_#{table_name} #{where}")
26
- end
22
+ connection.execute("DELETE FROM archived_#{table_name} #{where}")
27
23
  end
28
24
 
29
25
  def restore_all(conditions=nil)
@@ -21,10 +21,20 @@ module ActsAsArchive
21
21
  AS SELECT * from #{table_name}
22
22
  WHERE false;
23
23
  })
24
+ columns = connection.columns("archived_#{table_name}").collect(&:name)
25
+ unless columns.include?('deleted_at')
26
+ connection.add_column("archived_#{table_name}", :deleted_at, :datetime)
27
+ end
28
+ connection.add_index("archived_#{table_name}", :id)
29
+ connection.add_index("archived_#{table_name}", :deleted_at)
30
+ migrate_from_acts_as_paranoid
24
31
  end
25
- columns = connection.columns("archived_#{table_name}").collect(&:name)
26
- unless columns.include?('deleted_at')
27
- connection.add_column("archived_#{table_name}", 'deleted_at', :datetime)
32
+ end
33
+
34
+ def migrate_from_acts_as_paranoid
35
+ if column_names.include?('deleted_at')
36
+ # Base::Destroy.copy_to_archive
37
+ copy_to_archive('deleted_at IS NOT NULL', true)
28
38
  end
29
39
  end
30
40
  end
@@ -24,6 +24,10 @@ module ActsAsArchive
24
24
  :drop_table, :remove_column, :remove_columns,
25
25
  :remove_timestamps, :rename_column, :rename_table
26
26
  ]
27
+ if args.include?(:deleted_at) || args.include?('deleted_at')
28
+ # Don't change the archive's deleted_at column
29
+ return
30
+ end
27
31
  if !args.empty? && supported.include?(method)
28
32
  connection = ActiveRecord::Base.connection
29
33
  args[0] = "archived_" + ActiveRecord::Migrator.proper_table_name(args[0])
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: winton-acts_as_archive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Winton Welsh
@@ -9,11 +9,11 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-22 00:00:00 -07:00
12
+ date: 2009-04-23 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
16
- description: Moves your deleted records to a different table
16
+ description: Don't delete your records, move them to a different table
17
17
  email: mail@wintoni.us
18
18
  executables: []
19
19
 
@@ -46,7 +46,7 @@ files:
46
46
  - spec/spec.opts
47
47
  - spec/spec_helper.rb
48
48
  has_rdoc: false
49
- homepage: http://github.com/winton/
49
+ homepage: http://github.com/winton/acts_as_archive
50
50
  post_install_message:
51
51
  rdoc_options: []
52
52
 
@@ -70,6 +70,6 @@ rubyforge_project:
70
70
  rubygems_version: 1.2.0
71
71
  signing_key:
72
72
  specification_version: 2
73
- summary: Moves your deleted records to a different table
73
+ summary: Don't delete your records, move them to a different table
74
74
  test_files: []
75
75