Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby ORM单模型-乘法表_Ruby_Activerecord_Orm_Datamapper - Fatal编程技术网

Ruby ORM单模型-乘法表

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

拥有一个包含多个表的数据库。所有表都具有相同的结构。我正在写一个小的web应用程序来处理Ruby/Sinatra上的这个数据库。我想使用ORM-Active记录或DataMapper(首选)简化表的工作。针对多个表使用单一模型的手册提供了如下内容:

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