如何获取rails模板以在迁移列上添加其他属性?

时间:2011-10-07 16:13:24

标签: ruby-on-rails ruby

如何向应用程序模板中的迁移添加默认值等内容。

例如在template.rb中:

generate(:scaffold, "Thing title:string")

, :default => 'Foo Bar', :null => false之类的内容添加到创建标题列的迁移中的行的最佳方法是什么。

我有两个想法,但不知道是否有可能。

首先,可以从生成器向列中添加其他属性吗?调用rails g scaffold命令时可以设置默认值吗?

其次,我可以在模板中的生成行之后添加gsub_file行吗?我不知道如何在文件名称的一部分未知的文件上执行gsub_file(迁移的时间戳)。

Rails-3.1.0
Ruby-1.9.2-p290

2 个答案:

答案 0 :(得分:3)

基于@ mu_is_to_short的信息,我提出了一个不起眼的解决方案,它确实有效。随意评论如何清理它。在我的rails模板中:

generate "migration add_index_to_users_email"
index_migration_array = Dir['db/migrate/*_add_index_to_users_email.rb']
index_migration_file = index_migration_array.first
in_root { insert_into_file index_migration_file, 
  "\n    add_index :users, :email, unique: true", after: "change" }
rake "db:migrate"

Thor关于in_root的文件很少。我有初学者对Dir等的了解。感谢您的回答!他们就是我需要的。

答案 1 :(得分:1)

如果你看一下帮助:

$ rails generate model --help
Usage:
  rails generate model NAME [field:type field:type] [options]
[...]

除了字段名称和类型之外,您不会看到任何指定任何内容的选项。 AFAIK,如果您需要其他选项,则必须编辑生成的迁移。

如果你看the source,你会看到这样的事情:

def generate(what, *args)
  log :generate, what
  argument = args.map {|arg| arg.to_s }.flatten.join(" ")

  in_root { run_ruby_script("script/rails generate #{what} #{argument}", :verbose => false) }
end

所以也许您可以访问in_root(显然这些来自Thor)来将您置于应用程序根目录,以便您可以使用Dir['db/migrate/*']来查找迁移文件;你可能知道文件名,除了领先的时间戳和你知道的文件名部分是唯一的,因为它映射到类名。因此,您应该能够找到迁移文件,然后根据需要对其进行修补。