2015-04-29 41 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'作爲參數傳遞給generator? – 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(會話)? –

1

如果你希望你的遷移過程中編輯表名,那麼你應該添加一個參數:

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