Modify events table migration with plain SQL

This commit is contained in:
Enrico Stano
2018-05-10 22:30:48 +02:00
parent 780d733474
commit b08f271a7f
2 changed files with 40 additions and 16 deletions

View File

@ -1,13 +1,40 @@
# This migration does not use Rails ActiveRecord ORM DSL since
# it doesn't provide data integrity (foreign key) for polymorphic models.
#
# The technique applied is called Exclusive Belongs To (AKA Exclusive Arc)
#
# Please read the following article for more details:
# https://hashrocket.com/blog/posts/modeling-polymorphic-associations-in-a-relational-database
#
class CreateEvents < ActiveRecord::Migration
def change
create_table :events do |t|
t.string :action, :null => false
def up
execute <<-SQL
CREATE TYPE action_enum AS ENUM ('create', 'update');
t.integer :post_id
t.integer :member_id
t.integer :transfer_id
CREATE TABLE events (
id serial PRIMARY KEY,
action action_enum NOT NULL,
post_id integer REFERENCES posts,
member_id integer REFERENCES members,
transfer_id integer REFERENCES transfers,
created_at timestamp without time zone,
updated_at timestamp without time zone,
CHECK(
(
(post_id IS NOT NULL)::integer +
(member_id IS NOT NULL)::integer +
(transfer_id IS NOT NULL)::integer
) = 1
)
);
t.timestamps
end
CREATE UNIQUE INDEX ON events (post_id) WHERE post_id IS NOT NULL;
CREATE UNIQUE INDEX ON events (member_id) WHERE member_id IS NOT NULL;
CREATE UNIQUE INDEX ON events (transfer_id) WHERE transfer_id IS NOT NULL;
SQL
end
def down
drop_table :events
end
end

View File

@ -76,14 +76,8 @@ ActiveRecord::Schema.define(version: 20180501093846) do
add_index "documents", ["documentable_id", "documentable_type"], name: "index_documents_on_documentable_id_and_documentable_type", using: :btree
add_index "documents", ["label"], name: "index_documents_on_label", using: :btree
create_table "events", force: :cascade do |t|
t.string "action", null: false
t.integer "post_id"
t.integer "member_id"
t.integer "transfer_id"
t.datetime "created_at"
t.datetime "updated_at"
end
# Could not dump table "events" because of following StandardError
# Unknown type 'action_enum' for column 'action'
create_table "members", force: :cascade do |t|
t.integer "user_id"
@ -207,4 +201,7 @@ ActiveRecord::Schema.define(version: 20180501093846) do
add_index "users", ["email"], name: "index_users_on_email", using: :btree
add_foreign_key "accounts", "organizations"
add_foreign_key "events", "members", name: "events_member_id_fkey"
add_foreign_key "events", "posts", name: "events_post_id_fkey"
add_foreign_key "events", "transfers", name: "events_transfer_id_fkey"
end