2
0
mirror of https://github.com/moebooru/moebooru synced 2025-08-22 01:47:48 +00:00
moebooru/db/migrate/034_pools_create.rb
2018-03-10 18:15:56 +09:00

73 lines
2.3 KiB
Ruby

class PoolsCreate < ActiveRecord::Migration[5.1]
def self.up
ActiveRecord::Base.transaction do
execute <<-EOS
CREATE TABLE pools (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
created_at TIMESTAMP NOT NULL,
updated_at TIMESTAMP NOT NULL,
user_id INTEGER NOT NULL REFERENCES users ON DELETE CASCADE,
is_public BOOLEAN NOT NULL DEFAULT FALSE,
post_count INTEGER NOT NULL DEFAULT 0,
description TEXT NOT NULL DEFAULT ''
)
EOS
execute <<-EOS
CREATE TABLE pools_posts (
id SERIAL PRIMARY KEY,
sequence INTEGER NOT NULL DEFAULT 0,
pool_id INTEGER NOT NULL REFERENCES pools ON DELETE CASCADE,
post_id INTEGER NOT NULL REFERENCES posts ON DELETE CASCADE
)
EOS
execute <<-EOS
CREATE OR REPLACE FUNCTION pools_posts_delete_trg() RETURNS "trigger" AS $$
BEGIN
UPDATE pools SET post_count = post_count - 1 WHERE id = OLD.pool_id;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
EOS
execute <<-EOS
CREATE OR REPLACE FUNCTION pools_posts_insert_trg() RETURNS "trigger" AS $$
BEGIN
UPDATE pools SET post_count = post_count + 1 WHERE id = NEW.pool_id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
EOS
execute <<-EOS
CREATE TRIGGER pools_posts_insert_trg
BEFORE INSERT ON pools_posts
FOR EACH ROW
EXECUTE PROCEDURE pools_posts_insert_trg();
EOS
execute <<-EOS
CREATE TRIGGER pools_posts_delete_trg
BEFORE DELETE ON pools_posts
FOR EACH ROW
EXECUTE PROCEDURE pools_posts_delete_trg();
EOS
execute <<-EOS
CREATE INDEX pools_user_id_idx ON pools (user_id)
EOS
execute <<-EOS
CREATE INDEX pools_posts_pool_id_idx ON pools_posts (pool_id)
EOS
execute <<-EOS
CREATE INDEX pools_posts_post_id_idx ON pools_posts (post_id)
EOS
end
end
def self.down
ActiveRecord::Base.transaction do
execute "DROP TABLE pools_posts"
execute "DROP TABLE pools"
execute "DROP FUNCTION pools_posts_insert_trg()"
execute "DROP FUNCTION pools_posts_delete_trg()"
end
end
end