diff --git a/app/models/form/response.rb b/app/models/form/response.rb index e0a83228..54cac061 100644 --- a/app/models/form/response.rb +++ b/app/models/form/response.rb @@ -40,7 +40,7 @@ def destroyable? end def form_allows_responses? - return true if form.try(:allows_responses?) + return true if form.try(:allows_responses?) || user_id&.zero? errors.add(:form, 'does not allow responses') false diff --git a/db/migrate/20250219195453_remove_unique_index_from_form_responses.rb b/db/migrate/20250219195453_remove_unique_index_from_form_responses.rb new file mode 100644 index 00000000..c5f6a127 --- /dev/null +++ b/db/migrate/20250219195453_remove_unique_index_from_form_responses.rb @@ -0,0 +1,22 @@ +class RemoveUniqueIndexFromFormResponses < ActiveRecord::Migration[7.0] + def change + reversible do |dir| + dir.up do + remove_index :form_responses, name: 'index_form_responses_on_form_id_and_user_id' + + add_index :form_responses, %i[form_id user_id], + unique: true, + name: 'index_form_responses_on_form_id_and_user_id_partial', + where: 'user_id != 0' + end + + dir.down do + remove_index :form_responses, name: 'index_form_responses_on_form_id_and_user_id_partial' + + add_index :form_responses, %i[form_id user_id], + unique: true, + name: 'index_form_responses_on_form_id_and_user_id' + end + end + end +end diff --git a/db/schema.rb b/db/schema.rb index f73dab89..12df11b5 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2025_02_18_204807) do +ActiveRecord::Schema[7.0].define(version: 2025_02_19_195453) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -229,7 +229,7 @@ t.datetime "updated_at", precision: nil, null: false t.boolean "completed", default: false, null: false t.integer "lock_version" - t.index ["form_id", "user_id"], name: "index_form_responses_on_form_id_and_user_id", unique: true + t.index ["form_id", "user_id"], name: "index_form_responses_on_form_id_and_user_id_partial", unique: true, where: "(user_id <> 0)" t.index ["user_id"], name: "index_form_responses_on_user_id" end