Rails迁移生成器未生成列

3

睡眠不足可能会错过一些细微的问题,但是...

根据各种文档的阅读,我认为这将生成包括表和列声明的迁移...

$ script/generate migration Question ordinal_label:string question_text:string

然而,结果是...

class Question < ActiveRecord::Migration
  def self.up
  end

  def self.down
  end
end

为什么没有表格或列?

如果有一天他们实现了考虑构造迁移中字段定义的功能(正如我们许多人所希望的那样),您会注意到您的迁移名称很令人困惑。事实上,它变成了迁移类的名称,您最终会得到两个相同名称的类。我不知道这是否会成为问题,但可能确实如此。要获得与模型生成器相同的名称,请使用:g migration create_questions(...)。也就是说:1)在前面加上“create_”,2)使用复数形式。提示:记住mig.name是一个类名。请随意更新您的问题并删除我的评论。 - AgostinoX
3个回答

5
script/generate migration 命令不会在新表上创建列。
只有当您想要添加一个新列到现有表中时,才可以将新列作为参数传递:
script/generate migration add_text_to_question question_text:string

为了实现你的目标,你需要创建一个新的模型:
script/generate model Question ordinal_label:string question_text:string

这将生成以下类似的迁移:
class CreateQuestions < ActiveRecord::Migration
    def self.up
      create_table :questions do |t|
        t.string  :ordinal_label
        t.string  :question_text
        t.timestamps
      end
    end

    def self.down
      drop_table :questions
    end
  end

这当然是解决方案,但我抱怨的是它来自经验,而很容易被记录下来。或者当用户输入列定义时没有添加/删除时,它可能会出现错误,而不是简单地忽略它们。混淆的原因在于rails g migration的帮助表明它是一种创建迁移的方式,而不仅仅是添加或删除列的迁移。阅读帮助后,您会意识到这个任务(添加/删除)只是其中一个可用选项。因此,没有任何东西让您猜测列不被视为结构性迁移的一部分。 - AgostinoX

3

这应该是

$ script/generate model Question ordinal_label:string question_text:string

当然你最终会得到一个模型,单元测试以及 Fixture。使用 script/generatemigrate 可以将列添加到现有表中,但不会添加到新表中。

$ script/generate migration add_question_text_to_question question_text:string

0
如果你要修改模型,你需要一个动词。
script/generate migration AddLabelToQuestion label:string

或者生成一个新的模型,您可以使用上面的语句,但将“model”替换为“migration”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接