2013-07-14 2 views
0

SQLite에 테이블이 있는데이 테이블에 항목이 만들어지면 첫 번째 테이블의 각 항목에 대해 새 테이블을 만들고 싶습니다. 여기 SQLite 동적으로 테이블 만들기

내가 달성하기 위해 노력하고 무엇을 명확히하는 예이다 (즉, 도움이된다면 내가 루비 레일에이 작업을 수행 할) :

이 가정은 테이블 :

캠페인을 인 캠페인

CAMPAIGN_ID, 날짜, 이름 그래서

내가 입력 할 경우 :

01 06/12 FirstCampaign

라는 새 테이블 만드는 방법이있다 : {CAMPAIGN_ID} _Page는

예 :

01_Page

(이 테이블의 필드 여기)

+2

확실히, 적절한 CREATE TABLE을 데이터베이스에 보내면됩니다. 진짜 문제는 왜 그런 일을하려는 것입니까? 캠페인의 많은 자신의 페이지에 추가 된 후에 –

+0

하나 개의 페이지 테이블을 갖는 것은 엄청난된다. 각 캠페인의 페이지 테이블 크기를 제한하려고합니다. 이 일을하는 더 영리한 방법을 알고 계시다면 알려 주시기 바랍니다. 나는 내 솔루션이 영리하지 않다는 것을 알고있다. –

+1

캠페인 테이블의 모든 레코드에 별도의 테이블을 연결하려는 것 같습니다. MongoDB를 고려해 보셨습니까? – moritz

답변

0

왜 필요한가요?

나는 당신의 테이블 캠페인에 외래 키가있는 테이블 페이지를 만들 더 나은 것 같아요.

예 (내가 속편을 사용) :

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를 사용을 시도 할 수 있습니다.

속편와 예 : 테이블이 이미 존재하는 경우

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 

내 예는, 더 테스트가 없습니다. 정말로 그것을 사용하고 싶다면

관련 문제