Ruby ORM单模型-乘法表
拥有一个包含多个表的数据库。所有表都具有相同的结构。我正在写一个小的web应用程序来处理Ruby/Sinatra上的这个数据库。我想使用ORM-Active记录或DataMapper(首选)简化表的工作。针对多个表使用单一模型的手册提供了如下内容:Ruby ORM单模型-乘法表,ruby,activerecord,orm,datamapper,Ruby,Activerecord,Orm,Datamapper,拥有一个包含多个表的数据库。所有表都具有相同的结构。我正在写一个小的web应用程序来处理Ruby/Sinatra上的这个数据库。我想使用ORM-Active记录或DataMapper(首选)简化表的工作。针对多个表使用单一模型的手册提供了如下内容: class Table include DataMapper::Resource property id, Serial property item, String end class TableA < Table s
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
# Model declaration
DataMapper.finalize
itemA = Table.new (use_table: 'table_a')
itemB = Table.new (use_table: 'table_b')
实现这一点的方法之一是使用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
类表
包含数据映射器::资源
属性id,串行
属性项,字符串
结束
table_names={'TableA'=>'table_a','TableB'=>'table_b'}
表|名称。每个do | klass |名称,表|名称|
评估作为一种解决方案是可能的,但并不完全是需要的。补充问题。看起来您想要使用工厂模式。您可以在Table
中添加一个方法,该方法将接受Table\u名称
,并返回Table
的子类。您可以通过在表
中添加所有子类的缓存来实现此方法,这些子类按名称索引。如果在查找中找不到当前名称,则生成一个新的子类并将其添加到索引中。我在活动记录中找到解决方案。这是代码刚刚工作:类测试
结束
Test.table\u name=“tests\u a”
itema=Test.new
itema.item=“aaa”itema.save
测试.table\tests\u b”
itemb=Test.new
itemb.bbb.save