Символ & используется для обозначения того, что следующий аргумент следует рассматривать как блок, заданный методу. Это означает, что если это еще не объект Proc, его метод to_proc будет вызываться, чтобы преобразовать его в один.
Таким образом, ваш пример приводит к чему-то вроде
Post.all.map(&:id.to_proc)
что, в свою очередь, эквивалентно
Post.all.map { |x| x.id }
Таким образом, он выполняет итерацию по коллекции, возвращаемой Post.all, и создает массив с результатом метода id, вызываемого для каждого элемента.
Это работает, потому что Symbol#to_proc создает Proc, который берет объект и вызывает метод с именем символа на нем. Он в основном используется для удобства, чтобы сохранить некоторую типизацию.
Ответ 2
& означает, что вы передаете блок
Post.all - это приемник метода .map, и его блок передается на