【问题标题】:How to define dynamic AR table name如何定义动态 AR 表名
【发布时间】:2015-07-08 12:00:47
【问题描述】:

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

【问题讨论】:

  • “my_default_name”从何而来?每个用户
  • 您想将self.table_name 作为参数传递给生成器吗?
  • my_default_name 顾名思义是我自己定义的。所以表名总是my_default_name。我想允许用户使用自定义名称生成迁移

标签: ruby-on-rails generator


【解决方案1】:

您要么需要存储 user_id 和表名之间的映射,要么遵循基于 user_id 的标准模式(例如“_orders”)

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

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

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

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

  1. 如果是随机的,存储用户id和用户订单表名的映射关系。

    def self.table_name
       "special_" + super
    end 
    

【讨论】:

  • 我没有任何映射。我对用户一无所知。我想允许用户在生成迁移时使用自定义名称。但是我在 AR 类中需要那个名字
  • 您需要在迁移前存储映射并使用答案中的选项 2
  • 也许我在这里遗漏了一些东西,但是如何在模型中访问 c​​urrent_user(session)?
【解决方案2】:

如果您想在迁移期间编辑 table_name,那么您应该添加一个参数:

argument :table_name, type: :string, default: "my_default_name"

然后在migration_template和gsub Order类中使用:

gsub_file 'path to your order.rb', /self.table_name.*/, "self.table_name = #{table_name}"

注意,传递给 order.rb 必须是绝对的或相对于source_root

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2013-02-16
    • 2014-06-30
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多