2013-08-23 31 views
1

我正在使用Ruby on Rails,我必須創建一個導入器從一個數據庫到另一個。每個數據庫中有超過100個表,我不想爲每個表創建一個模型。有沒有可能創建查詢,指定一個表名?我不希望模型綁定到表。在軌道上的紅寶石在一個模型中的多個表

例如:FirstDatabase.select('*').from('some_table').where(...)

沒有set_table_name ...只是動態模型

此外,我需要做的刀片在不同的表

+0

您是否需要使用導軌?從外面可能會更容易 –

+0

我們使用rails,因爲多線程 – staskjs

回答

4

我不會爲任務中使用的模型在所有。請根據需要使用基本連接的#select_all,#exec_insert,#exec_update和#exec_delete方法。

ActiveRecord::Base.connection.select_all("select * from #{table_name}") 

返回行的散列數組。

ActiveRecord::Base.connection.exec_insert("insert into #{table} (foo, bar) values(#{foo}, #{bar}) 

插入一行。無論您使用的是哪種數據庫,這些值都需要正確轉義字符串,日期等。

ActiveRecord::Base.connection.quote("fo'o") 
=> "'fo''o'" # When server is PostgreSQL 

返回適用於SQL語句的帶引號的字符串表示形式。

now=Time.now 
=> Fri Aug 23 02:24:40 -0700 2013 

ActiveRecord::Base.connection.quote(now) 
=> "'2013-08-23 09:24:40.365843'" 

以UTC時區返回帶引號的日期/時間表示。

要處理多個數據庫,你可以做一些事情,比如爲每個數據庫設置一個模型,然後從這些模型而不是從ActiveRecord :: Base獲取連接。

class TableInDbA << ActiveRecord::Base 
    establish_connection "database_a_#{Rails.env}" 
end 

class TableInDbB << ActiveRecord::Base 
    establish_connection "database_b_#{Rails.env}" 
end 

TableInDbA.connection.select_all("... 
+0

你搖滾,這真棒!我不知道我可以做到這一點。請注意,對於更長,更復雜的SQL字符串(包括UNION語句),可以使用'%Q()'構建多行字符串。 – RSmithlal