标题可能有点误导或广泛,但我想要做的是为续集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
表达式,但我总是得到一个没有列的表。有任何想法吗?
答案 0 :(得分:1)
一行以单词开头的DSL,然后是它们之间具有彗差的参数列表实际上是方法调用,所以原始代码实际上是:
DB.create_table :items do
primary_key(:id)
String(:name)
Float(:price)
end
create_table
块内的大多数方法调用都会创建列, 因为method_missing
调用了列。列通常由。创建 将列类型指定为方法名称,后跟列 要使用的名称符号,之后应该使用任何选项。如果 这个方法是Sequel认可的红宝石类名,Sequel会 将其转换为给定数据库的适当类型。所以 当您指定String
时,续集实际上会使用varchar
或text
取决于底层数据库。
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