续集gem:根据运行时提供的模式创建表

时间:2014-05-13 11:12:13

标签: ruby gem sequel

标题可能有点误导或广泛,但我想要做的是为续集gem提供创建表格所需的数据。 Sequel用于创建表的语法如下

DB.create_table :items do
  primary_key :id
  String :name
  Float :price
end

对于我的特定情况,列类型和名称由用户提供,因此我只能在运行时进行。目前我正在接受一个column_name:column_type对的数组,例如:

['column1:string', 'column2:float']

但是我很难将这些信息提供给上面的块。我目前的尝试是:

my_db.create_table 'my_table' do
      array_of_typed_columns.each do |tc|
        column, type = tc.split(':')
        type.capitalize.constantize; column.to_sym
      end
    end

我的理解是上面的代码会导致表创建块产生连续的Type symbolized_column_name表达式,但我总是得到一个没有列的表。有任何想法吗?

1 个答案:

答案 0 :(得分:1)

一行以单词开头的DSL,然后是它们之间具有彗差的参数列表实际上是方法调用,所以原始代码实际上是:

DB.create_table :items do
  primary_key(:id)
  String(:name)
  Float(:price)
end

续集documentation

  

create_table块内的大多数方法调用都会创建列,   因为method_missing调用了列。列通常由。创建   将列类型指定为方法名称,后跟列   要使用的名称符号,之后应该使用任何选项。如果   这个方法是Sequel认可的红宝石类名,Sequel会   将其转换为给定数据库的适当类型。所以   当您指定String时,续集实际上会使用varchartext   取决于底层数据库。

create_table阻止使用method_missing找出您要说的内容。所以你可以尝试做的是改用send

my_db.create_table 'my_table' do
  array_of_typed_columns.each do |tc|
    column, type = tc.split(':')
    send(type.capitalize, column.to_sym)
  end
end