2010-05-17 4 views
2

Je travaille sur une application Rails qui utilise categories pour items.Nested Select dans Rails

Mon modèle category est auto-joint afin que les catégories peuvent être imbriquées:

class Category < ActiveRecord::Base 
    has_many :items 

    # Self Join (categories can have subcategories) 
    has_many :subcategories, :class_name => "Category", :foreign_key => "parent_id" 
    belongs_to :parent,  :class_name => "Category" 
    ... 
end 

J'ai une forme qui permet à un utilisateur de créer un item référençant toutes les catégories dans une sélection, mais ils sont tous énumérées ensemble:

<%= f.label :category_id %> 
<%= select :item, :category_id, Category.all.collect {|c| [ c.title, c.id ]} %> 

ainsi, la sélection ressemble à quelque chose comme ceci:

Category1 
Category2 
Category3BelongsTo2 
Category4BelongsTo1 

Mais ce que je veux est:

Category1 
    - Category4BelongsTo1 
Category2 
    - Category3BelongsTo2 

Y at-il une aide pour cela (ce qui serait génial!)? Sinon, comment pourrais-je accomplir cela?

Merci!

Répondre

1

awesome_nested_set fait de ce morceau de gâteau.

Après l'installation, j'ai ajouté lft et rgt au tableau de catégories et retiré la jointure automatique. Puis reconstruit la table de catégories en utilisant Category.rebuild!. Alors la sélection peut être facilement peuplée comme ceci:

<%= f.select :parent_id, nested_set_options(Category, @category) {|c| "#{'-' * c.level} #{c.title}" } %>