У меня есть модель Category
, в которой name:string categoryId:integer parent_id:integer
categoryId
не имеет значения, в этом случае я знаю, что она не соответствует соглашению об именах RoR, но у меня есть веские причины для этого ... Модель выглядит следующим образом:
has_many :children, :class_name => 'Category', :foreign_key => 'parent_id'
belongs_to :parent, :class_name => 'Category', :foreign_key => 'parent_id'
....
...
..
scope :top_categories, where("parent_id IS NULL")
У меня была похожая проблема с представлением здесь , и это работает хорошо, но теперь мне нужно выпадающее меню со всеми категориями, отображаемыми в его иерархии.Это действительно мешает мне, я просто не понимаю!Я хочу, чтобы верхние категории, включая детей, и дети должны включать ее детей, ... Как я могу отобразить это в массиве?
Мне нужны эти данные для collection_select
, который должен отображать всю навигацию, ноне в одной области, я хочу отобразить это так:
Top-Category1
---Sub-Category1
------Sub-Category1-1
------Sub-Category1-2
---Sub-Category2
Top-Category2
---Sub-Category1
Кто-нибудь может мне помочь?
// Решил это так:
def self.recursive_categories(categories, prefix='')
c = []
categories.collect do |cat|
current = Struct::Category.new
current.id = cat.id
current.name = "#{prefix}#{cat.name}"
c << current
if cat.children
c += recursive_categories( cat.children, prefix + '--' )
end
end
c
end
Я определилStruct::Category
в ApplicationHelper, который включен в ApplicationController.Затем я использовал это, чтобы отобразить его в виде:
<%= f.collection_select :category_id, Category.recursive_categories(Category.top_categories), :id, :name %>