2014-07-20 16 views
1

擁有一個包含多個表的數據庫。所有表具有相同的結構。我正在編寫一個小型的Web應用程序來處理Ruby/Sinatra上的這個數據庫。我想簡化使用ORM的工作表 - Active Record或DataMapper(首選)。對於使用多個表的單一模式的手冊提供的是這樣的:ORM一個模型 - 乘法表

class Table 
    include DataMapper::Resource 
    property id, Serial 
    property item, String 
end 

class TableA < Table 
    self.table_name = 'table_a' 
end 

class TableB < Table 
    self.table_name = 'table_b' 
end 

這可怎麼好十幾張桌子來完成,而不copypaste?

如果可能,決定應該是添加/刪除表而不更改代碼/設置並重新啓動應用程序的可能性。

喜歡的東西:

# Model declaration 

DataMapper.finalize 

itemA = Table.new (use_table: 'table_a') 
itemB = Table.new (use_table: 'table_b') 
+0

http://stackoverflow.com/questions/5981724/multiple-database-tables-within-one-ar-model-in-rails-3 – Reisenfag

回答

0

一來實現這一目標是使用eval的方式。

class Table 
    include DataMapper::Resource 
    property id, Serial 
    property item, String 
end 

table_names = {'TableA' => 'table_a', 'TableB' => 'table_b'} 

table_names.each do |klass_name, table_name| 
eval <<DYNAMIC 
    class #{klass_name} < Table 
    self.table_name = '#{table_name}' 
    end 
DYNAMIC 
end 
+0

作爲一個解決方案是可能的,但並不需要很什麼。補充了這個問題。 – Reisenfag

+0

它看起來像你想使用工廠模式。你可以在'Table'中添加一個方法來接受'table_name'並返回'Table'的子類。您可以通過在名稱索引的「Table」中添加一個所有子類的緩存來實現此方法。如果在查找中沒有找到當前名稱,則生成一個新的子類並將其添加到索引中。 – Nishu

+0

我在Active Record中找到解決方案。這是代碼只是工作: '類測試<的ActiveRecord :: Base' 'end' 'Test.table_name = 「tests_a」'' 意達= Test.new' 'itema.item = 「AAA」' 'itema.save' 'Test.table_name = 「tests_b」'' = itemb Test.new' 'itemb.item = 「BBB」'' itemb.save' – Reisenfag