Как правильно передать коллекцию для ввода в Formtastic

Мне нужно передать коллекцию на стандартный вход select в Formtastic:

f.input :apple, :as => :select, :collection => Apple.all

Проблема в том, что мне нужна Formtastic для доступа к другому методу, кроме имени. Теперь это действительно проблема. Я всегда могу передать массив

f.input :apple, :as => :select, :collection => Apple.map { |a| a.format_name }

Проблема в том, что после этого я получу строки в контроллере вместо идентификаторов, которые нежелательны. Вместо этого я попытался передать Hash:

options = Hash.new
Apple.each { |a| Apple.store(a.format_name, a.id) }
f.input :apple, :as => :select, :collection => options

Теперь проблема заключается в том, что, поскольку я использую Ruby 1.8.7, хэш-порядок не задан, и я, конечно, нуждаюсь в упорядоченном вводе...

Я могу представить некоторые решения, но все они требуют ненужного кода.

Любая идея, как решить это право?

Ответ 1

Try:

f.input :apple, :as => :select, :collection => Apple.all, :label_method => :format_name, :value_method => :id

Ответ 2

В formtastic документации нет прямого указания, но коллекция также может быть вложенными массивами, поэтому проблема решается посредством:

f.input :apple, :as => :select, :collection => Apple.map { |a| [ a.format_name, a.id ] }

Ответ 3

Это правильный путь:

f.input :apple,
        as: :select,
        collection: Apple.pluck(:format_name, :id)

Это устанавливает collection в массив из [name, id] кортежей. Легко!

Недостаточно устаревший способ:

Используйте параметр member_label, например

f.input :apple,
        as: :select,
        collection: Apple.all,
        member_label: :format_name

Документация здесь в комментарии к коду.