在我的gem中,我有Rails生成器来构建迁移。迁移非常简单:
class MigrateGenerator < Rails::Generators::Base
source_root File.expand_path(File.join(File.dirname(__FILE__), '../generators/templates'))
def create_migration
template "migration_template.rb", "db/migrate/create_orders_table.rb"
end
end
class CreateOrdersTable < ActiveRecord::Migration
def self.up
create_table(:my_default_name) do |t|
#some columns
end
#indexes
end
end
class Order < ActiveRecord::Base
self.primary_key = :id
self.table_name = 'my_default_name'
end
我的问题:是否有可能允许用户定义自己的表名?我知道我可以轻松地将参数传递给我的生成器但是如何更改定义的self.table_name = 'my_default_name'
答案 0 :(得分:1)
您需要在user_id和表名之间存储映射,或者遵循基于user_id的标准模式(例如&#34; _orders&#34;)
self.table_name
既可以是字符串也可以是方法。
如果您使用的是标准模式:
self.table_name = "#{current_user.id}_orders"
确保在访问此模型之前已登录。
如果是随机的,则存储用户ID和用户订单的表名之间的映射。
def self.table_name
"special_" + super
end
答案 1 :(得分:1)
如果要在迁移期间编辑table_name,则应添加参数:
argument :table_name, type: :string, default: "my_default_name"
然后在migration_template和gsub Order class:
中使用它gsub_file 'path to your order.rb', /self.table_name.*/, "self.table_name = #{table_name}"
请注意,传递给order.rb必须是source_root