2015-04-29 3 views
0

В моем драгоценном камне у меня есть генератор Rails для создания миграции. Эта миграция очень проста:Как определить динамическое имя таблицы AR

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

Откуда появляется 'my_default_name'? для каждого пользователя – emaillenin

+0

вы хотите передать 'self.table_name' генератору в качестве параметра? – lx00st

+0

'my_default_name', как следует из названия, определяется мной. Поэтому всегда имя таблицы будет 'my_default_name'. Я хотел бы разрешить пользователю генерировать миграцию с настраиваемым именем – dewastator

ответ

1

Либо вам нужно сохранить отображение между user_id и имени таблицы или следовать стандартной схеме, основанной на user_id (например. «_orders»)

self.table_name может быть как строкой, так и методом.

  1. Если вы используете стандартный шаблон:

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

Убедитесь, что вы вошли в систему, прежде чем доступ к этой модели.

  1. Если это случайное значение, храните сопоставление между идентификатором пользователя и именем таблицы заказов пользователя.

    def self.table_name 
        "special_" + super 
    end 
    
+0

У меня нет сопоставления. Я ничего не знаю о пользователе. Я хотел бы разрешить пользователю, когда они генерируют миграцию, чтобы использовать собственное имя. Но чем мне нужно это имя в AR-классе – dewastator

+0

, вам нужно сохранить сопоставление перед переносом и использовать вариант 2 из ответа – emaillenin

+0

Возможно, что-то здесь отсутствует, но как current_user (session) доступен в модели? –

1

Если вы хотите редактировать table_name во время миграции, то вы должны добавить параметр:

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

, а затем использовать его в migration_template и GSUB Заказать класс:

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

Обратите внимание, что переход к order.rb должен быть абсолютным или относительным к source_root

Смежные вопросы