affected_on_destroy
affected_on_destroy is a simple Rails plugin that recursively reflects on defined associations and lets you know which records will be deleted/nullified when using :dependent => :destroy or :dependent => :nullify.
Installation
config.gem 'murbanski-affected_on_destroy', :lib => 'affected_on_destroy', :source => 'http://gems.github.com'
Usage
schema.rb:
create_table "users", :force => true do |t|
t.string "login"
t.string "password"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "blogs", :force => true do |t|
t.integer "user_id"
t.string "name"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "posts", :force => true do |t|
t.integer "blog_id"
t.text "content"
t.datetime "created_at"
t.datetime "updated_at"
end
models: class User < ActiveRecord::Base has_many :blogs, :dependent => :destroy end
class Blog < ActiveRecord::Base
belongs_to :user
has_many :posts, :dependent => :nullify
end
class Post < ActiveRecord::Base
belongs_to :blog
end
Sample script/console session: » marcin = User.create(:login => ‘marcin’, :password => ‘my_pass’) => #<User id: 1, login: “marcin”, password: “my_pass”, created_at: “2009-06-26 01:47:36”, updated_at: “2009-06-26 01:47:36”>
>> blog = marcin.blogs.create(:name => 'My Ruby Blog')
=> #<Blog id: 1, user_id: 1, name: "My Ruby Blog", created_at: "2009-06-26 01:47:57", updated_at: "2009-06-26 01:47:57">
>> blog.posts.create(:content => 'Ruby tricks #1')
=> #<Post id: 1, blog_id: 1, content: "Ruby tricks #1", created_at: "2009-06-26 01:48:40", updated_at: "2009-06-26 01:48:40">
>> blog.posts.create(:content => 'Ruby tricks #2')
=> #<Post id: 2, blog_id: 1, content: "Ruby tricks #2", created_at: "2009-06-26 01:48:45", updated_at: "2009-06-26 01:48:45">
What records will be affected when we destroy user ‘marcin’? » marcin.affected_on_destroy => [#<Blog id: 1, user_id: 1, name: “My Ruby Blog”, created_at: “2009-06-26 01:47:57”, updated_at: “2009-06-26 01:47:57”>, #<Post id: 1, blog_id: 1, content: “Ruby tricks #1”, created_at: “2009-06-26 01:48:40”, updated_at: “2009-06-26 01:48:40”>, #<Post id: 2, blog_id: 1, content: “Ruby tricks #2”, created_at: “2009-06-26 01:48:45”, updated_at: “2009-06-26 01:48:45”>]
A bit cleaner summary - only with model name and id: » puts marcin.affected_on_destroy_info Blog 1 Post 1 Post 2 => nil
Which models are affected when destroying user? » User.affected_on_destroy => [“Blog”, “Post”]
Same for blog: » Blog.affected_on_destroy => [“Post”]
Rails Version
Works on Rails 2.3 and 2.2