Data Explorer `int_list` 将第一个元素替换为0

不确定这是 bug 还是我操作有误,但在数据探索器查询中,int_list 数组的第一个元素似乎总是被替换为 0。

例如:

-- int_list :categories = "3, 5, 6"

会被改为 [0, 5, 6]

查看:

如果我在控制台中执行,会得到预期的输出:

string = "3,5,6"
value = string.split(',').map { |s| s.downcase == '#null' ? nil : s.to_i }
=> [3, 5, 6]

您可以使用以下查询复现此问题:

-- [params]
-- int_list :categories = "3, 5, 6"

SELECT *
FROM topics 
WHERE topics.category_id = ANY (ARRAY [ :categories ]  )

要触发错误(以便查看错误信息),只需删除右括号,例如:

-- [params]
-- int_list :categories = "3, 5, 6"

SELECT *
FROM topics 
WHERE topics.category_id = ANY (ARRAY [ :categories   )
PG::SyntaxError: ERROR:  syntax error at or near ")"
LINE 12: WHERE topics.category_id = ANY (ARRAY [ 0,5,6   )
                                                         ^

(查看该数组)

看起来,当您以这种方式为 int_list 参数设置默认值时:

-- int_list :categories = "3, 5, 6"

实际上会执行以下操作:

'"1'.downcase.to_i

这将返回 0

您可以通过去掉默认参数的引号来绕过此问题:

-- int_list :categories = 3, 5, 6

该值在被分割为数组之前仍会被解释为字符串。也许该插件应该在字符串输入添加了外部引号时将其去除。

谢谢 Simon!:smiley:

我本来确信自己试过那个……现在再看才发现,在正文中修改默认参数并点击 保存并运行 没有任何效果——你要么在保存后刷新页面,要么同时修改输入框中的字段值(这个我完全忘了)。

仅供参考,我觉得参数确实很难推敲,我在想我们是否应该将这一点从“魔法注释”转移到完整的用户体验讨论中,@riking

没错,这样做完全合理。之前的“魔法注释”是为了最小化插件来源的数据库迁移数量,而这类问题如今已少得多。