Files
danbooru/db/migrate/20100211181944_create_favorites.rb
2013-03-19 23:10:10 +11:00

60 lines
1.3 KiB
Ruby

class CreateFavorites < ActiveRecord::Migration
TABLE_COUNT = 100
def self.up
# this is a dummy table and should not be used
create_table "favorites" do |t|
t.column :user_id, :integer
t.column :post_id, :integer
end
0.upto(TABLE_COUNT - 1) do |i|
execute <<-EOS
create table favorites_#{i} (
check (user_id % 100 = #{i})
) inherits (favorites)
EOS
add_index "favorites_#{i}", :user_id
add_index "favorites_#{i}", :post_id
end
fragment = []
1.upto(TABLE_COUNT - 1) do |i|
fragment << <<-EOS
elsif (NEW.user_id % 100 = #{i}) then
insert into favorites_#{i} values (NEW.*);
EOS
end
execute <<-EOS
create or replace function favorites_insert_trigger()
returns trigger as $$
begin
if (NEW.user_id % 100 = 0) then
insert into favorites_0 values (NEW.*);
#{fragment.join("\n")}
end if;
return NULL;
end;
$$
language plpgsql
EOS
execute <<-EOS
create trigger insert_favorites_trigger
before insert on favorites
for each row execute procedure favorites_insert_trigger()
EOS
end
def self.down
drop_table "favorites"
0.upto(TABLE_COUNT - 1) do |i|
drop_table "favorites_#{i}"
end
end
end