如何定义动态 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既可以是字符串也可以是方法。

  1. 如果您使用的是标准模式:

    self.table_name = "#{current_user.id}_orders"
    

确保您在访问此模型之前已登录。

  1. 如果是随机的,存储用户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