Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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 Sequel gem:基于运行时提供的模式创建表_Ruby_Gem_Sequel - Fatal编程技术网

Ruby Sequel gem:基于运行时提供的模式创建表

Ruby Sequel gem:基于运行时提供的模式创建表,ruby,gem,sequel,Ruby,Gem,Sequel,这个标题可能有点误导或宽泛,但我想做的是为sequel gem创建一个表提供必要的数据。Sequel创建表的语法如下 DB.create_table :items do primary_key :id String :name Float :price end 对于我的特殊情况,列类型和名称由用户提供,因此我只能在运行时执行。目前,我接受一个column\u name:column\u type对数组,例如: ['column1:string', 'column2:float']

这个标题可能有点误导或宽泛,但我想做的是为sequel gem创建一个表提供必要的数据。Sequel创建表的语法如下

DB.create_table :items do
  primary_key :id
  String :name
  Float :price
end
对于我的特殊情况,列类型和名称由用户提供,因此我只能在运行时执行。目前,我接受一个column\u name:column\u 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

我的理解是,上面的代码将导致连续的
类型符号化的列名称
表达式屈服于表创建块,但我总是得到一个没有列的表。有什么想法吗

在DSL中,一行以一个单词开头,然后是一列参数,它们之间有一个coma,实际上是一个方法调用,因此原始代码实际上是:

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

create\u表
块中的大多数方法调用都会创建列, 因为
方法\u缺少
调用列。列通常由 将列类型指定为方法名称,后跟列 命名要使用的符号,以及在此之后应使用的任何选项。如果 该方法是Sequel可以识别的ruby类名,Sequel将 将其转换为给定数据库的适当类型。所以 当您指定
String
时,Sequel实际上将使用
varchar
text
取决于基础数据库

create\u table
块使用
method\u 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