You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

20101104182107_add_unique_index_on_members.rb 962B

12345678910111213141516171819202122
  1. class AddUniqueIndexOnMembers < ActiveRecord::Migration[4.2]
  2. def self.up
  3. # Clean and reassign MemberRole rows if needed
  4. MemberRole.where("member_id NOT IN (SELECT id FROM #{Member.table_name})").delete_all
  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.where(["id = ?", i]).delete_all
  13. end
  14. # Then add a unique index
  15. add_index :members, [:user_id, :project_id], :unique => true
  16. end
  17. def self.down
  18. remove_index :members, [:user_id, :project_id]
  19. end
  20. end