从表名中查找模型名称(续集ORM)

时间:2012-02-23 07:27:34

标签: ruby orm sequel

在ruby脚本中,我正在运行一个循环,在该循环中,我从表列表中动态获取表名,并且必须对其执行某种CRUD操作(主要是插入)。 我正在使用Sequel Orm并为各种表创建模型。 如何为每个表找到模型的名称,以便我可以执行插入?

    tables=["table1","table2",'table3",...]
    tables.each do |t|
    #perform insertion on t
    #how to find the model name for table t?
    end

我可以使用哈希来存储每个表的模型名称,或者可以遵循将每个表的第一个字符转换为大写或类似的模式。

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

在一般情况下,如果没有暴力搜索,你所要求的是不可能的,即使这样,它也是模棱两可的,原因很简单:以下是有效的:

class Foo < Sequel::Model(:table1); end
class Bar < Sequel::Model(:table1); end

基本上,每个模型都有一个相关的数据集(通常只是一个简单的SELECT * FROM表)。但是,其他模型可以使用相同或类似的数据集。因此从模型到表格很简单,但是表格到模型不是。

如果您已经创建了自己的模型,那么处理所需内容的最简单方法是使用哈希:

ModelMap = {}
ModelMap["table1"] = Model1
ModelMap["table2"] = Model2

然后你可以这样做:

ModelMap[t]

在每个块内部获取模型类。

答案 1 :(得分:0)

只要在模型和表之间遵循复数约定,从表名中获取模型名的一种方法是:

table_name = :users
table_name.to_s.classify 

但是,这似乎并不是您要尝试的。您需要插入新的或更新现有的配音。由于您已经有了表名,因此不妨考虑执行以下操作:

tables=["table1","table2",'table3",...]
tables.each do |t| 
  DB[t.to_sym].insert(...)
end

但是,您可能希望考虑答案在上面的杰里米·埃文斯(Jeremy Evans)是Sequel瑰宝的创建者,如果他不建议这样做,那么可能有充分的理由。