Операции выполняются в порядке их приоритета. Операции в соответствующей строке кода выполняются в следующем порядке:
- << </li>
- ==
- ?,:
См. Полный список по приоритету операции Ruby.
Здесь в скобках указано, что на самом деле происходит в вашем примере:
(((@ids << x) == 'a') ? [1,2] : [3,4])
^^^----1----^ ^ ^
||---------2--------| |
|------------------3-----------------|
Чтобы получить результат Вы ожидаете, напишите
@ids << (x == 'a' ? [1,2] : [3,4])
или
@ids.push(x == 'a' ? [1,2] : [3,4])
Надеюсь, вы найдете это полезным.