Data Explorer の `int_list` が 1 番目の要素を 0 に置き換える

バグなのか、私の操作に問題があるのかわかりませんが、データエクスプローラーのクエリで 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

この値も、配列に分割される前に文字列として解釈されます。もし文字列入力で外側の引用符が追加された場合、プラグインがそれを除去するよう修正する必要があるかもしれません。

ありがとう、サイモン!:smiley:

確かに試したはずだったのに…もう一度見てみると、本文のデフォルトパラメータを変更して「保存して実行」をクリックしても反映されないことがわかりました。保存後にページをリフレッシュするか、フィールドの入力欄の値も変更する必要があります(これをすっかり忘れていました)。

参考までに、パラメータの扱いについては非常に煩雑だと感じています。魔法的なコメントの代わりに、完全な UX へ移行すべきではないでしょうか @riking

その方針は完全に理にかなっていますね。マジックコメントは、プラグイン由来のデータベースマイグレーション数を最小化するよう最適化されていましたが、最近はそれがそれほど問題にはなりません。