如何向应用程序模板中的迁移添加默认值等内容。
例如在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
答案 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/*']
来查找迁移文件;你可能知道文件名,除了领先的时间戳和你知道的文件名部分是唯一的,因为它映射到类名。因此,您应该能够找到迁移文件,然后根据需要对其进行修补。