0

SQLite にテーブルがあり、このテーブルにエントリが作成されたら、最初のテーブルのエントリごとに新しいテーブルを作成したいと思います。(それが役立つなら、Ruby On Railsでこれをやりたいです)

私が達成しようとしていることを明確にするための例を次に示します。

次の表があるとします: Campaigns

キャンペーン

Campaign_ID、日付、名前

したがって、エントリを作成すると:

01 06/12 ファーストキャンペーン

{Campaign_ID}_Page という名前の新しいテーブルを作成する方法はありますか

すなわち:

01_ページ

(このテーブルのフィールドはここにあります)

4

1 に答える 1

0

なぜあなたはそれが必要なのですか?

表 Campaigns への外部キーを持つ表 Pages を作成する方がよいと思います。

例 (私は 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

しかし、あなたの質問に答えるには:モデル フックを使用してみることができます。

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

テーブルが既に存在する場合、私の例にはテストがありません。どうしても使いたい場合は、

于 2013-07-14T19:27:56.617 に答える