2013-07-14 9 views
0

У меня есть таблица в SQLite, и когда запись сделана в этой таблице, я хотел бы создать новую таблицу для каждой записи в первой таблице. (Я хочу сделать это в Ruby On Rails, если это помогает)SQLite Создание таблицы динамически

Вот пример для выяснения того, что я пытаюсь достичь:

Пусть есть таблица: Кампания

кампании

CAMPAIGN_ID, дата, название

Так что, если я делаю запись:

01 06/12 FirstCampaign

есть способ, чтобы создать новую таблицу с именем: {CAMPAIGN_ID} _page

т.е.

01_Page

(поля для этой таблицы идут здесь)

+2

Конечно, просто отправьте соответствующий CREATE TABLE в базу данных. Реальный вопрос, однако, почему вы пытаетесь это сделать? –

+0

Стол одной таблицы становится огромным после добавления большого количества кампаний со своими страницами. Я пытаюсь ограничить размер таблицы страниц для каждой кампании. Пожалуйста, дайте мне знать, если вы знаете более умный способ сделать это. Я знаю, что мое решение не умное ха-ха. –

+1

Кажется, что вам нужна отдельная таблица, связанная с каждой записью таблицы кампаний? Вы считали MongoDB? – moritz

ответ

0

Зачем вам это нужно?

Я думаю, что было бы лучше создать таблицу Страницы с внешним ключом для вашего стола Кампании.

Пример (я использую Sequel):

require 'sequel' 

DB = Sequel.sqlite 

DB.create_table :Campaigns do 
    primary_key :id 
    column :campaign_id, :integer 
    column :date, :date 
    column :name, :string 
end 

DB.create_table :Pages do 
    primary_key :id 
    foreign_key :campaign_id, :Campaigns 
    column :text, :string 
end 

key = DB[:Campaigns].insert(:campaign_id => 01, :date=> Date.new(2012,1,1), :name => 'FirstCampaign') 
DB[:Pages].insert(:campaign_id => key, :text => 'text for FirstCampaign') 

key = DB[:Campaigns].insert(:campaign_id => 02, :date=> Date.new(2012,1,1), :name => 'SecondCampaign') 
DB[:Pages].insert(:campaign_id => key, :text => 'text for SecndCampaign') 

#All pages for 1st campaign 
p DB[:Pages].filter(
    :campaign_id => DB[:Campaigns].filter(:campaign_id => 1).first[:id] 
).all 

Но чтобы ответить на ваш вопрос: Вы можете попробовать использовать model hook.

Пример с Sequel:

require 'sequel' 

DB = Sequel.sqlite 

DB.create_table :Campaigns do 
    primary_key :id 
    column :campaign_id, :integer 
    column :date, :date 
    column :name, :string 
end 


class Campaign < Sequel::Model 
    def after_create 
    tabname = ("%05i_page" % self.campaign_id).to_sym 
    puts "Create table #{tabname}" 
    self.db.create_table(tabname) do 
     foreign_key :campaign 
    end 
    end 
end 

p DB.table_exists?(:'01_page') #-> false, table does not exist 
Campaign.create(:campaign_id => 01, :date=> Date.new(2012,1,1), :name => 'FirstCampaign') 
p DB.table_exists?(:'00001_page') #-> true Table created 

Мой пример не тест, если таблица уже существует. Если вы действительно хотите его использовать,

Смежные вопросы