Modify events table migration with plain SQL
This commit is contained in:
@ -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
|
||||
|
||||
13
db/schema.rb
13
db/schema.rb
@ -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
|
||||
|
||||
Reference in New Issue
Block a user