Ruby on Rails迁移数据库不一致(Ruby on Rails 3基本培训第6章)

时间:2012-06-16 06:05:32

标签: ruby-on-rails ruby

我正在做Lynda课程,我正准备迁移数据库。首先,似乎我的Rails(3.2.6)的新版本中的默认值与视频中的默认值有所不同,但我看了一下Ruby网站并发现它可能无关紧要

然而,我遇到的问题是,在创建定义列(attribs)的Users模型时,它会创建所有内容,除了我自己定义的那些(名字,姓氏,电子邮件和密码)不会被创建。我假设只创建日期,修改日期和ID,因为它们是默认的,只是开箱即用。

以下是视频告诉您使用的代码:

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string "first_name", :limit => 25
      t.string "last_name", :limit => 50
      t.string "email", :default => "", :null => false
      t.string "password", :limit => 40
      t.timestamps
    end
  end

  def down
    drop_table :users
  end
end

我在下面的差异中添加了两个星号,主要的一个是我的版本中的def up默认值,但在视频版本中它是def self.up。我在阅读Rails网站上的文档时注意到的另一件事是,您应该使用:而不是引号。由于视频给出的代码不起作用,我也尝试了下面的代码。但是我得到了相同的结果,实际上没有在表中创建t.strings

class CreateUsers < ActiveRecord::Migration
  **def up**
    create_table :users do |t|
      t.string **:**first_name, :limit => 25
      t.string **:**last_name, :limit => 50
      t.string **:**email, :default => "", :null => false
      t.string **:**"password", :limit => 40
      t.timestamps
    end
  end

  **def down**
    drop_table :users
  end
end

所以有两个问题:

  1. 我没有使用正确的语法吗?

  2. 第一次“设置”表后,如果再次执行此操作,是否会覆盖旧配置?我是否必须再次创建一个全新的数据库?我不确定通过更改'users'文件并重新排列语法,然后执行rake db:migrate,我可以覆盖那里的内容。

  3. 非常感谢你的帮助。

    -Dave

1 个答案:

答案 0 :(得分:1)

符号与字符串无关紧要。 Self.up vs. up是较旧的风格,但也无所谓。 Rails跟踪它已在模式迁移表中运行的迁移。这样做的结果是,一旦迁移运行,即使您更改了它,rails也不会再次运行它。

你可以做到

rake db:rollback

让rails为最后一次运行的迁移运行down方法(因此下次运行时会再次运行db:migrate

创建新的迁移以添加额外的列可能更合适 - 如果您已将原始迁移推送到存储库,我通常会这样做