60 lines
1.3 KiB
Ruby
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
|