Ruby Sequel gem:基于运行时提供的模式创建表
这个标题可能有点误导或宽泛,但我想做的是为sequel gem创建一个表提供必要的数据。Sequel创建表的语法如下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']
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