如何定义动态AR表名

时间:2015-04-29 09:33:16

标签: ruby-on-rails generator

在我的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'

2 个答案:

答案 0 :(得分:1)

您需要在user_id和表名之间存储映射,或者遵循基于user_id的标准模式(例如&#34; _orders&#34;)

self.table_name既可以是字符串也可以是方法。

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

    self.table_name = "#{current_user.id}_orders"
    
  2. 确保在访问此模型之前已登录。

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

的绝对值或相对值