如何定义动态 AR table 名称
How to define dynamic AR table name
在我的 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
我的问题:是否有可能允许用户定义自己的 table 名称?我知道我可以轻松地将参数传递给我的生成器,但是如何更改已定义的 self.table_name = 'my_default_name'
您需要存储 user_id 和 table 名称之间的映射,或者遵循基于 user_id 的标准模式(例如“_orders”)
self.table_name
既可以是字符串也可以是方法。
如果您使用的是标准模式:
self.table_name = "#{current_user.id}_orders"
确保您在访问此模型之前已登录。
如果是随机的,存储用户id和table用户订单名称的映射。
def self.table_name
"special_" + super
end
如果您想在迁移过程中编辑 table_name,那么您应该添加一个参数:
argument :table_name, type: :string, default: "my_default_name"
然后在migration_template和gsub命令中使用class:
gsub_file 'path to your order.rb', /self.table_name.*/, "self.table_name = #{table_name}"
注意传递给 order.rb 必须是绝对的或相对于 source_root
在我的 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
我的问题:是否有可能允许用户定义自己的 table 名称?我知道我可以轻松地将参数传递给我的生成器,但是如何更改已定义的 self.table_name = 'my_default_name'
您需要存储 user_id 和 table 名称之间的映射,或者遵循基于 user_id 的标准模式(例如“_orders”)
self.table_name
既可以是字符串也可以是方法。
如果您使用的是标准模式:
self.table_name = "#{current_user.id}_orders"
确保您在访问此模型之前已登录。
如果是随机的,存储用户id和table用户订单名称的映射。
def self.table_name "special_" + super end
如果您想在迁移过程中编辑 table_name,那么您应该添加一个参数:
argument :table_name, type: :string, default: "my_default_name"
然后在migration_template和gsub命令中使用class:
gsub_file 'path to your order.rb', /self.table_name.*/, "self.table_name = #{table_name}"
注意传递给 order.rb 必须是绝对的或相对于 source_root