是否可以在Rails 2.3.8迁移中创建带密钥的表?

时间:2011-03-25 11:48:25

标签: ruby-on-rails

我知道我可以创建一个表,然后在Rails 2.3.8迁移中添加索引,例如

class CreateFoos < ActiveRecord::Migration
  def self.up
    create_table :foos do |t|
      t.timestamps
      t.string :bar
    end
    add_index :foos, :bar
  end
end

我可以创建一个表并在CREATE TABLE子句中指定一个键吗?上面的迁移生成如下SQL:

CREATE TABLE `foos` (
    `id` int(11) NOT NULL auto_increment,
    `created_at` datetime default NULL,
    `updated_at` datetime default NULL,
    `bar` varchar(255) default NULL,
     PRIMARY KEY  (`id`)
);
ALTER TABLE foos ADD INDEX `index_bar` (`bar`);

但我想要的是:

CREATE TABLE `foos` (
    `id` int(11) NOT NULL auto_increment,
    `created_at` datetime default NULL,
    `updated_at` datetime default NULL,
    `bar` varchar(255) default NULL,
     PRIMARY KEY  (`id`),
     KEY `index_bar` (`bar`)
)

我知道这可以用#execute完成,但使用Rails-y块会更好。这可以在标准的Rails 2.3.8中完成吗?使用插件?

2 个答案:

答案 0 :(得分:1)

您可以在采用原始SQL的Rails迁移中运行'execute'命令。您的迁移可能如下所示:

class CreateFoos < ActiveRecord::Migration
  def self.up
    sql = <<-SQL # This is a "here document"
      CREATE TABLE `foos` (
             `id` int(11) NOT NULL auto_increment,
             `created_at` datetime default NULL,
             `updated_at` datetime default NULL,
             `bar` varchar(255) default NULL,
             PRIMARY KEY  (`id`),
             KEY `index_bar` (`bar`)
      )
    SQL

    execute sql
  end

  def self.down
    drop_table :foos
  end
end

答案 1 :(得分:-2)

试试这个

create_table :foos do |t|
  t.timestamps
  t.index :bar
end