From 6e0315965b960890b85f3296763e7ca11e7c9cf7 Mon Sep 17 00:00:00 2001 From: Raphael Sofaer Date: Wed, 30 Mar 2011 11:18:04 -0700 Subject: [PATCH 1/3] add unique index --- db/migrate/20110330175950_tag_uniqueness.rb | 9 +++++++++ db/schema.rb | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20110330175950_tag_uniqueness.rb diff --git a/db/migrate/20110330175950_tag_uniqueness.rb b/db/migrate/20110330175950_tag_uniqueness.rb new file mode 100644 index 000000000..223a6dd61 --- /dev/null +++ b/db/migrate/20110330175950_tag_uniqueness.rb @@ -0,0 +1,9 @@ +class TagUniqueness < ActiveRecord::Migration + def self.up + add_index :taggings, [:taggable_id, :taggable_type, :context, :tag_id], :unique => true, :name => 'index_taggings_uniquely' + end + + def self.down + remove_index :taggings, :name => 'index_taggings_uniquely' + end +end diff --git a/db/schema.rb b/db/schema.rb index f199a9998..f2d99aced 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20110328202414) do +ActiveRecord::Schema.define(:version => 20110330175950) do create_table "aspect_memberships", :force => true do |t| t.integer "aspect_id", :null => false @@ -328,6 +328,7 @@ ActiveRecord::Schema.define(:version => 20110328202414) do end add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id" + add_index "taggings", ["taggable_id", "taggable_type", "context", "tag_id"], :name => "index_taggings_uniquely", :unique => true add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context" create_table "tags", :force => true do |t| From 23af0d14b0aca472c7cf857019c91e5cc0b17d63 Mon Sep 17 00:00:00 2001 From: Raphael Sofaer Date: Wed, 30 Mar 2011 11:40:26 -0700 Subject: [PATCH 2/3] Take context out of index, delete dup taggings --- db/migrate/20110330175950_tag_uniqueness.rb | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/db/migrate/20110330175950_tag_uniqueness.rb b/db/migrate/20110330175950_tag_uniqueness.rb index 223a6dd61..df2c67691 100644 --- a/db/migrate/20110330175950_tag_uniqueness.rb +++ b/db/migrate/20110330175950_tag_uniqueness.rb @@ -1,6 +1,20 @@ class TagUniqueness < ActiveRecord::Migration + def self.delete_duplicate_taggings + duplicate_rows = execute <1; +SQL + duplicate_rows.each do |row| + execute < true, :name => 'index_taggings_uniquely' + delete_duplicate_taggings + add_index :taggings, [:taggable_id, :taggable_type, :tag_id], :unique => true, :name => 'index_taggings_uniquely' end def self.down From 2a18ded47c1e59dc05ae77dbd7913cd83755afc6 Mon Sep 17 00:00:00 2001 From: Raphael Sofaer Date: Wed, 30 Mar 2011 11:52:36 -0700 Subject: [PATCH 3/3] Finish tags migration --- db/migrate/20110330175950_tag_uniqueness.rb | 5 +++-- db/schema.rb | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/db/migrate/20110330175950_tag_uniqueness.rb b/db/migrate/20110330175950_tag_uniqueness.rb index df2c67691..bd4a4cd55 100644 --- a/db/migrate/20110330175950_tag_uniqueness.rb +++ b/db/migrate/20110330175950_tag_uniqueness.rb @@ -1,17 +1,18 @@ class TagUniqueness < ActiveRecord::Migration def self.delete_duplicate_taggings duplicate_rows = execute <1; SQL duplicate_rows.each do |row| execute < true, :name => 'index_taggings_uniquely' diff --git a/db/schema.rb b/db/schema.rb index f2d99aced..578cee0b6 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -328,8 +328,8 @@ ActiveRecord::Schema.define(:version => 20110330175950) do end add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id" - add_index "taggings", ["taggable_id", "taggable_type", "context", "tag_id"], :name => "index_taggings_uniquely", :unique => true add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context" + add_index "taggings", ["taggable_id", "taggable_type", "tag_id"], :name => "index_taggings_uniquely", :unique => true create_table "tags", :force => true do |t| t.string "name"