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 / 20130215111141_populate_issues_closed_on.rb @ 1298:4f746d8966dd
History | View | Annotate | Download (1.33 KB)
| 1 | 1295:622f24f53b42 | Chris | class PopulateIssuesClosedOn < ActiveRecord::Migration |
|---|---|---|---|
| 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 | |||
| 16 | # Then set closed_on for closed issues that weren't up updated by the above UPDATE
|
||
| 17 | # No journal was found so we assume that they were closed on creation
|
||
| 18 | Issue.update_all "closed_on = created_on", {:status_id => closed_status_ids, :closed_on => nil} |
||
| 19 | end
|
||
| 20 | end
|
||
| 21 | |||
| 22 | def down |
||
| 23 | Issue.update_all :closed_on => nil |
||
| 24 | end
|
||
| 25 | end |