From 24a11c957a34d2f22c0276fa8dcc3e2c23d1f164 Mon Sep 17 00:00:00 2001 From: Andreas Brandl Date: Sun, 4 Feb 2018 20:46:14 +0100 Subject: Set todos#author_id to NOT NULL. --- app/models/todo.rb | 1 + .../unreleased/32282-add-foreign-keys-to-todos.yml | 2 +- ...200836_change_author_id_to_not_null_in_todos.rb | 26 ++++++++++++++++++++++ db/schema.rb | 4 ++-- spec/models/todo_spec.rb | 1 + 5 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 db/post_migrate/20180204200836_change_author_id_to_not_null_in_todos.rb diff --git a/app/models/todo.rb b/app/models/todo.rb index 7af54b2beb2..bb5965e20eb 100644 --- a/app/models/todo.rb +++ b/app/models/todo.rb @@ -28,6 +28,7 @@ class Todo < ActiveRecord::Base delegate :name, :email, to: :author, prefix: true, allow_nil: true validates :action, :project, :target_type, :user, presence: true + validates :author, presence: true validates :target_id, presence: true, unless: :for_commit? validates :commit_id, presence: true, if: :for_commit? diff --git a/changelogs/unreleased/32282-add-foreign-keys-to-todos.yml b/changelogs/unreleased/32282-add-foreign-keys-to-todos.yml index 5b551e260d3..e74c2a8b9ff 100644 --- a/changelogs/unreleased/32282-add-foreign-keys-to-todos.yml +++ b/changelogs/unreleased/32282-add-foreign-keys-to-todos.yml @@ -1,5 +1,5 @@ --- -title: Add foreign key constraints to todos table. +title: Add foreign key and NOT NULL constraints to todos table. merge_request: 16849 author: type: other diff --git a/db/post_migrate/20180204200836_change_author_id_to_not_null_in_todos.rb b/db/post_migrate/20180204200836_change_author_id_to_not_null_in_todos.rb new file mode 100644 index 00000000000..92c32feebf7 --- /dev/null +++ b/db/post_migrate/20180204200836_change_author_id_to_not_null_in_todos.rb @@ -0,0 +1,26 @@ +class ChangeAuthorIdToNotNullInTodos < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + class Todo < ActiveRecord::Base + self.table_name = 'todos' + include EachBatch + end + + BATCH_SIZE = 1000 + + DOWNTIME = false + + disable_ddl_transaction! + + def up + Todo.where(author_id: nil).each_batch(of: BATCH_SIZE) do |batch| + batch.delete_all + end + + change_column_null :todos, :author_id, false + end + + def down + change_column_null :todos, :author_id, true + end +end diff --git a/db/schema.rb b/db/schema.rb index dd8d14fb401..c56cb461320 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20180202111106) do +ActiveRecord::Schema.define(version: 20180204200836) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -1707,7 +1707,7 @@ ActiveRecord::Schema.define(version: 20180202111106) do t.integer "project_id", null: false t.integer "target_id" t.string "target_type", null: false - t.integer "author_id" + t.integer "author_id", null: false t.integer "action", null: false t.string "state", null: false t.datetime "created_at" diff --git a/spec/models/todo_spec.rb b/spec/models/todo_spec.rb index 3e8f3848eca..bd498269798 100644 --- a/spec/models/todo_spec.rb +++ b/spec/models/todo_spec.rb @@ -20,6 +20,7 @@ describe Todo do it { is_expected.to validate_presence_of(:action) } it { is_expected.to validate_presence_of(:target_type) } it { is_expected.to validate_presence_of(:user) } + it { is_expected.to validate_presence_of(:author) } context 'for commits' do subject { described_class.new(target_type: 'Commit') } -- cgit v1.2.1