diff --git a/plugins/custom_forms/db/migrate/20130823151900_associate_fields_to_alternatives.rb b/plugins/custom_forms/db/migrate/20130823151900_associate_fields_to_alternatives.rb index 0cf7d67..1c3882a 100644 --- a/plugins/custom_forms/db/migrate/20130823151900_associate_fields_to_alternatives.rb +++ b/plugins/custom_forms/db/migrate/20130823151900_associate_fields_to_alternatives.rb @@ -15,14 +15,18 @@ class AssociateFieldsToAlternatives < ActiveRecord::Migration end CustomFormsPlugin::Answer.find_each do |answer| - labels = [] - answer.value.split(',').each do |value| - labels << answer.field.choices.invert[value] - end - labels.compact! - if labels.present? - answer.value = answer.field.alternatives.where('label IN (?)', labels).map(&:id).join(',') - answer.save! + # Avoid crash due to database possible inconsistency on submissions without form + begin + labels = [] + answer.value.split(',').each do |value| + labels << answer.field.choices.invert[value] + end + labels.compact! + if labels.present? + answer.value = answer.field.alternatives.where('label IN (?)', labels).map(&:id).join(',') + answer.save! + end + rescue end end diff --git a/plugins/custom_forms/db/migrate/20140505131703_remove_submissions_without_form.rb b/plugins/custom_forms/db/migrate/20140505131703_remove_submissions_without_form.rb new file mode 100644 index 0000000..696ece4 --- /dev/null +++ b/plugins/custom_forms/db/migrate/20140505131703_remove_submissions_without_form.rb @@ -0,0 +1,11 @@ +class RemoveSubmissionsWithoutForm < ActiveRecord::Migration + def self.up + CustomFormsPlugin::Submission.find_each do |submission| + submission.destroy if submission.form.nil? + end + end + + def self.down + say "This migration is irreversible." + end +end diff --git a/plugins/custom_forms/lib/custom_forms_plugin/form.rb b/plugins/custom_forms/lib/custom_forms_plugin/form.rb index 0eed935..9b67478 100644 --- a/plugins/custom_forms/lib/custom_forms_plugin/form.rb +++ b/plugins/custom_forms/lib/custom_forms_plugin/form.rb @@ -4,7 +4,7 @@ class CustomFormsPlugin::Form < Noosfero::Plugin::ActiveRecord has_many :fields, :order => 'position', :class_name => 'CustomFormsPlugin::Field', :dependent => :destroy accepts_nested_attributes_for :fields, :allow_destroy => true - has_many :submissions, :class_name => 'CustomFormsPlugin::Submission' + has_many :submissions, :class_name => 'CustomFormsPlugin::Submission', :dependent => :destroy serialize :access diff --git a/plugins/custom_forms/test/unit/custom_forms_plugin/form_test.rb b/plugins/custom_forms/test/unit/custom_forms_plugin/form_test.rb index f44f1ca..1b23413 100644 --- a/plugins/custom_forms/test/unit/custom_forms_plugin/form_test.rb +++ b/plugins/custom_forms/test/unit/custom_forms_plugin/form_test.rb @@ -260,4 +260,18 @@ class CustomFormsPlugin::FormTest < ActiveSupport::TestCase form2.destroy assert_includes Task.canceled, task2 end + + should 'destroy submissions after form is destroyed' do + form = CustomFormsPlugin::Form.create!(:profile => fast_create(Profile), :name => 'Free Software') + s1 = CustomFormsPlugin::Submission.create!(:form => form, :profile => fast_create(Profile)) + s2 = CustomFormsPlugin::Submission.create!(:form => form, :profile => fast_create(Profile)) + form.destroy + + assert_raise ActiveRecord::RecordNotFound do + s1.reload + end + assert_raise ActiveRecord::RecordNotFound do + s2.reload + end + end end -- libgit2 0.21.2