Ruby Sequel MatchData错误“无法表达#<matchdata”

时间:2016-07-03 04:26:35

标签: ruby-on-rails ruby sequel

=“”

我有一个数字和文本连接的变量(例如“[79511]火箭”)。如果此变量确实包含括号内的数字,那么我必须在我的表的一列中存储(仅限数字)。我用以下代码验证了这一点:

Animal

当我使用Puts进行测试时,它的工作原理为79511,很好。 但是当我运行代码插入数据库时​​,如下所示:

enterprise_id = "[79511]Rocket".split(/[\[\]]/x)[1].match(/^(\d)+$/) rescue nil

目标列是表格中的整数类型。

它会抛出错误:

enterprise_id = "[79511]Rocket".split(/[\[\]]/x)[1].match(/^(\d)+$/) rescue nil
insert_ds = DB["INSERT INTO pd_deals ( enterprise_id ) VALUES (?)",  enterprise_id]
insert_ds.insert

我这样做是因为我需要从字符串中提取一个数字。有暗示吗?有没有更好的方法?

1 个答案:

答案 0 :(得分:2)

如果您执行:

"[79511]Rocket".split(/[\[\]]/x)[1].match(/^(\d)+$/)
irb

,您会看到:

=> #<MatchData "79511" 1:"1"> 

因为String#match返回MatchData个实例,而inspect上的MatchData调用#<MatchData ...>会给您puts。如果您puts "[79511]Rocket".split(/[\[\]]/x)[1].match(/^(\d)+$/) 该值:

79511

您会看到puts,因为to_s会在其参数上调用to_s将其转换为字符串。

续集不会调用MatchData,它会尝试弄清楚如何将参数转换为数据库自己理解的内容,并且它不知道如何处理can't express #<MatchData "79511" 1:"1"> as a SQL literal 实例,因此:

to_s

错误。

您可以自己致电DB["INSERT INTO pd_deals ( enterprise_id ) VALUES (?)", enterprise_id.to_s.presence]

MatchData#[]

或使用DB["...", enterprise_id ? enterise_id[0] : nil] 方法:

String#[]

甚至使用enterprise_id = "[79511]Rocket"[/(?<=\[)\d+(?=\])/] DB["...", enterprise_id.presence] ,正如Cary Swoveland所暗示的那样:

to_i

我对Sequel并不熟悉,因此您可能需要进行一些'79511'来电,将79511字符串转换为M*S*sizeof(float)/8e-3/1e9=14GB/s 个数字。