diff --git a/lib/data_fixup/fix_out_of_sync_outcome_alignments.rb b/lib/data_fixup/fix_out_of_sync_outcome_alignments.rb index aaa7ad0a32c..6fc7ff1a85b 100644 --- a/lib/data_fixup/fix_out_of_sync_outcome_alignments.rb +++ b/lib/data_fixup/fix_out_of_sync_outcome_alignments.rb @@ -1,70 +1,124 @@ module DataFixup::FixOutOfSyncOutcomeAlignments def self.run # Active alignments to deleted rubrics - ContentTag.joins(" - INNER JOIN rubrics r - ON content_tags.content_id = r.id - AND content_tags.content_type = 'Rubric' - ").where(" + if Rails.version < '3.0' + scope = ContentTag.scoped(joins: + "INNER JOIN rubrics r + ON content_tags.content_id = r.id + AND content_tags.content_type = 'Rubric' + ", select: "content_tags.*") + else + scope = ContentTag.joins(" + INNER JOIN rubrics r + ON content_tags.content_id = r.id + AND content_tags.content_type = 'Rubric' + ").select("content_tags.*") + end + scope = scope.where(" content_tags.tag_type = 'learning_outcome' AND content_tags.workflow_state = 'active' AND r.workflow_state = 'deleted' - ").find_each do |ct| + ") + scope.find_each do |ct| ct.destroy end # Active alignments to rubrics that should no longer be aligned - ContentTag.joins(" - INNER JOIN rubrics r - ON content_tags.content_id = r.id - AND content_tags.content_type = 'Rubric' - ").where(" + if Rails.version < '3.0' + scope = ContentTag.scoped(joins: + "INNER JOIN rubrics r + ON content_tags.content_id = r.id + AND content_tags.content_type = 'Rubric' + ", select: "content_tags.*") + else + scope = ContentTag.joins(" + INNER JOIN rubrics r + ON content_tags.content_id = r.id + AND content_tags.content_type = 'Rubric' + ").select("content_tags.*") + end + scope = scope.where(" content_tags.tag_type = 'learning_outcome' AND content_tags.workflow_state = 'active' AND r.workflow_state = 'active' AND NOT r.data LIKE '%:learning_outcome_id: ' || content_tags.learning_outcome_id || '%' - ").find_each do |ct| + ") + scope.find_each do |ct| ct.destroy end # Active alignments to assignments without rubrics - ContentTag.joins(" - INNER JOIN assignments a - ON content_tags.content_id = a.id - AND content_tags.content_type = 'Assignment' - LEFT OUTER JOIN rubric_associations ra - ON ra.association_id = a.id - AND ra.association_type = 'Assignment' - ").where(" + if Rails.version < '3.0' + scope = ContentTag.scoped(joins: + "INNER JOIN assignments a + ON content_tags.content_id = a.id + AND content_tags.content_type = 'Assignment' + LEFT OUTER JOIN rubric_associations ra + ON ra.association_id = a.id + AND ra.association_type = 'Assignment' + ", select: "content_tags.*") + else + scope = ContentTag.joins(" + INNER JOIN assignments a + ON content_tags.content_id = a.id + AND content_tags.content_type = 'Assignment' + LEFT OUTER JOIN rubric_associations ra + ON ra.association_id = a.id + AND ra.association_type = 'Assignment' + ").select("content_tags.*") + end + scope = scope.where(" content_tags.tag_type = 'learning_outcome' AND content_tags.workflow_state = 'active' AND ra.id IS NULL - ").find_each do |ct| + ") + scope.find_each do |ct| ct.destroy end # Active alignments to assignments with rubrics # that don't have a matching alignment - ContentTag.joins(" - INNER JOIN assignments a - ON content_tags.content_id = a.id - AND content_tags.content_type = 'Assignment' - INNER JOIN rubric_associations ra - ON ra.association_id = a.id - AND ra.association_type = 'Assignment' - INNER JOIN rubrics r - ON ra.rubric_id = r.id - LEFT OUTER JOIN content_tags ct2 - ON ct2.content_id = r.id - AND ct2.content_type = 'Rubric' - AND ct2.tag_type = 'learning_outcome' - AND ct2.workflow_state = 'active' - AND ct2.learning_outcome_id = content_tags.learning_outcome_id - ").where(" + if Rails.version < '3.0' + scope = ContentTag.scoped(joins: + "INNER JOIN assignments a + ON content_tags.content_id = a.id + AND content_tags.content_type = 'Assignment' + INNER JOIN rubric_associations ra + ON ra.association_id = a.id + AND ra.association_type = 'Assignment' + INNER JOIN rubrics r + ON ra.rubric_id = r.id + LEFT OUTER JOIN content_tags ct2 + ON ct2.content_id = r.id + AND ct2.content_type = 'Rubric' + AND ct2.tag_type = 'learning_outcome' + AND ct2.workflow_state = 'active' + AND ct2.learning_outcome_id = content_tags.learning_outcome_id + ", select: "content_tags.*") + else + scope = ContentTag.joins(" + INNER JOIN assignments a + ON content_tags.content_id = a.id + AND content_tags.content_type = 'Assignment' + INNER JOIN rubric_associations ra + ON ra.association_id = a.id + AND ra.association_type = 'Assignment' + INNER JOIN rubrics r + ON ra.rubric_id = r.id + LEFT OUTER JOIN content_tags ct2 + ON ct2.content_id = r.id + AND ct2.content_type = 'Rubric' + AND ct2.tag_type = 'learning_outcome' + AND ct2.workflow_state = 'active' + AND ct2.learning_outcome_id = content_tags.learning_outcome_id + ").select("content_tags.*") + end + scope = scope.where(" content_tags.tag_type = 'learning_outcome' AND content_tags.workflow_state = 'active' AND ct2.id IS NULL - ").find_each do |ct| + ") + scope.find_each do |ct| ct.destroy end end diff --git a/spec/migrations/fix_out_of_sync_outcome_alignments_spec.rb b/spec/migrations/fix_out_of_sync_outcome_alignments_spec.rb index f76e508e345..1eb3b477121 100644 --- a/spec/migrations/fix_out_of_sync_outcome_alignments_spec.rb +++ b/spec/migrations/fix_out_of_sync_outcome_alignments_spec.rb @@ -19,6 +19,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper.rb') describe DataFixup::FixOutOfSyncOutcomeAlignments do + self.use_transactional_fixtures = false before do course_with_teacher_logged_in(:active_all => true) @@ -81,4 +82,8 @@ describe DataFixup::FixOutOfSyncOutcomeAlignments do DataFixup::FixOutOfSyncOutcomeAlignments.run align.reload.should be_deleted end + + after(:all) do + truncate_all_tables + end end