Hi, seem to keep running into a wall here. I can’t find any resources on
site navigation that can deal with any model being in the nav, allow
nesting, and can dynamically update.
So I thought about it for a while, and decided on a MenuItems class,
which
contained the position of the child in relation to it’s siblings, where
the
parent and the child were polymorphic. Then a given childable object can
find it’s parentable by going through the menu_items table.
I want my nav to be able to do things like this:
–Category1
----SubCategory1
------Product1
------Product2
----Product3
–Category2
----Product4
–Page1
–Page2
–Page3
This is the current setup:
MODELS
class MenuItem < ActiveRecord::Base
belongs_to :childable , :polymorphic => true
belongs_to :parentable , :polymorphic => true
acts_as_list :scope => :parentable_id
end
class Category < ActiveRecord::Base
has_one :parent_menu_item , :as => :parentable , :class_name =>
‘MenuItem’
has_many :child_menu_items , :as => :childable , :class_name =>
‘MenuItem’
has_one :parentable , :through => :parent_menu_item
has_many :childables , :through => :child_menu_items
end
class SubCategory < ActiveRecord::Base
has_many :child_menu_items , :as => :childable , :class_name =>
‘MenuItem’
has_one :parent_menu_item , :as => :parentable , :class_name =>
‘MenuItem’
has_one :parent , :through => :parent_menu_item
has_many :children , :through => :child_menu_items
end
class Page < ActiveRecord::Base
has_one :parent_menu_item , :as => :parentable , :class_name =>
‘MenuItem’
has_one :parent , :through => :parent_menu_item
end
SCHEMA:
ActiveRecord::Schema.define(:version => 20100525184637) do
create_table “categories”, :force => true do |t|
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
end
create_table “menu_items”, :force => true do |t|
t.integer “position”, :null => false
t.integer “parentable_id”, :null => false
t.string “parentable_type”, :null => false
t.integer “childable_id”, :null => false
t.string “childable_class”, :null => false
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
end
create_table “pages”, :force => true do |t|
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
end
create_table “sub_categories”, :force => true do |t|
t.datetime “created_at”, :null => false
t.datetime “updated_at”, :null => false
end
end
I have had a lot of trouble with it, this is the best I’ve gotten so
far,
but I am still getting the error:
ActiveRecord::HasManyThroughAssociationPolymorphicError: Cannot have a
has_many :through association ‘Category#childables’ on the polymorphic
object ‘Childable#childable’.
Is there a way to make this work? Is there a better way to do this?