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.

20130215111141_populate_issues_closed_on.rb 1.4KB

1234567891011121314151617181920212223242526
  1. class PopulateIssuesClosedOn < ActiveRecord::Migration[4.2]
  2. def up
  3. closed_status_ids = IssueStatus.where(:is_closed => true).pluck(:id)
  4. if closed_status_ids.any?
  5. # First set closed_on for issues that have been closed once
  6. closed_status_values = closed_status_ids.map {|status_id| "'#{status_id}'"}.join(',')
  7. subselect = "SELECT MAX(#{Journal.table_name}.created_on)" +
  8. " FROM #{Journal.table_name}, #{JournalDetail.table_name}" +
  9. " WHERE #{Journal.table_name}.id = #{JournalDetail.table_name}.journal_id" +
  10. " AND #{Journal.table_name}.journalized_type = 'Issue' AND #{Journal.table_name}.journalized_id = #{Issue.table_name}.id" +
  11. " AND #{JournalDetail.table_name}.property = 'attr' AND #{JournalDetail.table_name}.prop_key = 'status_id'" +
  12. " AND #{JournalDetail.table_name}.old_value NOT IN (#{closed_status_values})" +
  13. " AND #{JournalDetail.table_name}.value IN (#{closed_status_values})"
  14. Issue.update_all "closed_on = (#{subselect})"
  15. # Then set closed_on for closed issues that weren't up updated by the above UPDATE
  16. # No journal was found so we assume that they were closed on creation
  17. Issue.where({:status_id => closed_status_ids, :closed_on => nil}).
  18. update_all("closed_on = created_on")
  19. end
  20. end
  21. def down
  22. Issue.update_all :closed_on => nil
  23. end
  24. end