Нет готового помощника (о котором я знаю), который мог бы сделать то, что вам нужно. Это несколько сложно сделать, потому что это будет зависеть от вашей модели данных. Это отношение типа «массив», «хэш», «родитель-ребенок» или «многие ко многим»?
Предполагая, что это родитель-потомок, вы можете использовать рекурсию для его построения:
def child_options_for_select(collection, children_method, group_label_method, child_value_method, child_label_method, options = {})
body = ''
collection.each do |item|
children = item.send(children_method)
if item.children.count != 0
body << content_tag(:optgroup, child_options_for_select(children, children_method, group_label_method, child_value_method, child_label_method, options), :label => item.send(group_label_method))
else
body << content_tag(:option, item.send(child_label_method), :value => item.send(child_value_method))
end
end
body.html_safe
end
Пример использования на ваш взгляд:
<%= select_tag 'foo', child_options_for_select(@categories.roots, :children, :to_s, :id, :to_s) %>
Обратите внимание, что это довольно медленно, поскольку включает в себя несколько поездок в базу данных.