2014-12-23 37 views
1

好的,我有以下方法:傳遞模塊和類名作爲參數傳遞給一個紅寶石功能

def update_window_for_ctm_staging_extract(target_database,target_table,table_name)     
    RptMcksWorkdb::CtmStagingExtractControl.               
     where(:src_tablename => table_name).                     
     update(:from_date_dttm => from_date_dttm, :to_date_dttm => to_date_dttm, :sequence_no => 1) 
end 

我想要的target_database和target_table參數分別爲模塊和類名,;然後將用該函數代替RptMcksWorkdb::CtmStagingExtractControl

所以我最後的功能將類似於此:

def update_window_for_ctm_staging_extract(target_database,target_table,table_name)     
     target_database::target_table.               
      where(:src_tablename => table_name).                     
      update(:from_date_dttm => from_date_dttm, :to_date_dttm => to_date_dttm, :sequence_no => 1) 
    end 

編輯:這是我的工作代碼:

def update_control_table_window(target_database, target_table, table_name) 
    model = "#{target_database.camelcase}::#{target_table.camelcase}".constantize 
    model. 
     where(:src_tablename => table_name). 
     update(:from_date_dttm => from_date_dttm, :to_date_dttm => to_date_dttm, :sequence_no => 1) 
end 
+0

謝謝,但我貼的代碼不起作用。 target_table變量在我的函數定義中沒有正確映射到相同的變量名稱。我的問題清楚地顯示在標題爲「如何傳遞模塊和類名作爲參數」 – FluffyKittens

+0

您收到的*精確*錯誤消息是什麼?你打算怎麼調用這個方法? –

回答

1

如果你在軌道上,

你可以使用camelecase/classifyconstantize的組合

> model = "#{'my_database'.camelcase}::#{'here_is_some_table'.camelcase}".constantize 
=> MyDatabase::HereIsSomeTable # Only work if you actually have such a constant 

那會給像

def update_window_for_ctm_staging_extract(target_database, target_table, table_name) 
    model = "#{'target_database'.camelcase}::#{'target_table'.camelcase}".constantize 
    model. 
     where(src_tablename: table_name). 
     update(from_date_dttm: from_date_dttm, to_date_dttm: to_date_dttm, sequence_no: 1) 
end 
+0

或者你也可以'class_name.const_get(constant_name)'。我會爲OP添加一個小修改:Ruby有方法而不是函數。 – Humza

+0

這與一些修改。我沒有使用rails,但我們使用的是主動支持gem,這似乎是我所需要的。我已將我的工作代碼放入我的OP中。 – FluffyKittens

0

最簡單的方法是隻通過你想要的類到你的方法,而不是傳遞包含模塊,並分別類:

def update_window_for_ctm_staging_extract(target_class, table_name) 
    target_class. 
    where(src_tablename: table_name). 
    update(from_date_dttm: from_date_dttm, to_date_dttm: to_date_dttm, sequence_no: 1) 
end 

update_window_for_ctm_staging_extract(
    RptMcksWorkdb::CtmStagingExtractControl, :customers) 

否則,您需要反射性地獲取常量的值:

def update_window_for_ctm_staging_extract(target_database, target_table, table_name) 
    const_get(target_database).const_get(target_table). 
    where(src_tablename: table_name). 
    update(from_date_dttm: from_date_dttm, to_date_dttm: to_date_dttm, sequence_no: 1) 
end 

update_window_for_ctm_staging_extract(
    :RptMcksWorkdb, :CtmStagingExtractControl, :customers)