Data Explorer의 `int_list`가 첫 번째 요소를 0으로 대체함

이것이 버그인지 아니면 제가 무언가를 잘못하고 있는지는 확신이 서지 않지만, data explorer 쿼리에서 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:

그렇게 해봤다고 확신했는데… 다시 보니 본문에서 기본 매개변수를 변경하고 저장 및 실행을 클릭해도 효과가 없더라고요. 저장 후 페이지를 새로고침하거나, 필드 상자의 값도 함께 변경해야 해요(이건 완전 잊고 있었네요).

참고로, 나는 params를 추론하는 것이 꽤 까다롭다고 생각합니다. @riking 이 부분을 완전한 UX로 전환할지, 아니면 마법 주석(magic comments)을 사용할지 고민이 됩니다.

맞아요, 그렇게 하는 게 완전히 합리적이에요. 마법 주석들은 플러그인에서 생성된 DB 마이그레이션의 수를 최소화하도록 최적화되어 있었는데, 요즘은 그런 문제가 훨씬 적어졌거든요.