我有一个Rails 5应用程序,它有三个数据库的单独迁移。我正在添加一个新数据库。我通常做一个rails g model field1:type1 field2:type2 field3:type
....来创建包含所需字段的数据库表。我想创建生成模型语句,它将生成所需数据库的模型并将其放在相应的db / migrate文件夹中。
我为lib / generators中的其他数据库提供了自定义数据库迁移生成器。以下是自定义迁移生成器的示例。
lib/generators/stats_migration_generator.rb
require 'rails/generators/active_record/migration/migration_generator'
class StatsMigrationGenerator < ActiveRecord::Generators::MigrationGenerator
source_root File.join(File.dirname(ActiveRecord::Generators::MigrationGenerator.instance_method(:create_migration_file).source_location.first), "templates")
def create_migration_file
set_local_assigns!
validate_file_name!
migration_template @migration_template, "db_stats/migrate/#{file_name}.rb"
end
end
我假设我需要创建lib / generators / mydb_model_generator.rb或者为每个附加数据库创建正确的文件名结构。我想在查看GitHub中的model_generator.rb文件之后我可以做这样的事情。
lib/generators/stats_model_generator.rb
require 'rails/generators/active_record/model/model_generator'
class StatsModelGenerator < ActiveRecord::Generators::ModelGenerator
source_root File.join(File.dirname(ActiveRecord::Generators::ModelGenerator.instance_method(:create_migration_file).source_location.first), "templates")
def create_migration_file
set_local_assigns!
validate_file_name!
migration_template @migration_template, "db_stats/migrate/#{file_name}.rb"
end
end
在查看Rails的git存储库,the Rails Guide regarding creating and customizing Generators和Ruby on Rails API文档后,我的问题是:
在我尝试创建模型生成器时,我的假设是否正确?
答案 0 :(得分:1)
嗯,我认为我不会那么快找到解决方案。我又看了一眼GitHub中的model_generator.rb并且有一个aha时刻。我意识到我只需要用我的版本替换默认生成器中的方法,该版本指向我想要的db migrate文件夹。这是我提出的解决方案。
require 'rails/generators/active_record/model/model_generator'
class MydbModelGenerator < ActiveRecord::Generators::ModelGenerator
source_root File.join(File.dirname(ActiveRecord::Generators::ModelGenerator.instance_method(:create_migration_file).source_location.first), "templates")
def create_migration_file
return unless options[:migration] && options[:parent].nil?
attributes.each { |a| a.attr_options.delete(:index) if a.reference? && !a.has_index? } if options[:indexes] == false
migration_template "../../migration/templates/create_table_migration.rb", File.join("db_mydb/migrate", "create_#{table_name}.rb")
end
end
现在我可以执行rails g mydb_model field1:type1 field2:type2 field3:type
并在正确的迁移文件夹中创建模型迁移文件。