To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / db / migrate / 20101104182107_add_unique_index_on_members.rb @ 442:753f1380d6bc
History | View | Annotate | Download (949 Bytes)
| 1 |
class AddUniqueIndexOnMembers < ActiveRecord::Migration |
|---|---|
| 2 |
def self.up |
| 3 |
# Clean and reassign MemberRole rows if needed
|
| 4 |
MemberRole.delete_all("member_id NOT IN (SELECT id FROM #{Member.table_name})") |
| 5 |
MemberRole.update_all("member_id =" + |
| 6 |
" (SELECT min(m2.id) FROM #{Member.table_name} m1, #{Member.table_name} m2" +
|
| 7 |
" WHERE m1.user_id = m2.user_id AND m1.project_id = m2.project_id" +
|
| 8 |
" AND m1.id = #{MemberRole.table_name}.member_id)")
|
| 9 |
# Remove duplicates
|
| 10 |
Member.connection.select_values("SELECT m.id FROM #{Member.table_name} m" + |
| 11 |
" WHERE m.id > (SELECT min(m1.id) FROM #{Member.table_name} m1 WHERE m1.user_id = m.user_id AND m1.project_id = m.project_id)").each do |i| |
| 12 |
Member.delete_all(["id = ?", i]) |
| 13 |
end
|
| 14 |
|
| 15 |
# Then add a unique index
|
| 16 |
add_index :members, [:user_id, :project_id], :unique => true |
| 17 |
end
|
| 18 |
|
| 19 |
def self.down |
| 20 |
remove_index :members, [:user_id, :project_id] |
| 21 |
end
|
| 22 |
end
|