I've got several models that I'd like to relate together hierarchically. For simplicity's sake, let's say I've got these three:
class Group < ActiveRecord::Base
acts_as_tree
has_many :users
end
class User < ActiveRecord::Base
acts_as_tree
belongs_to :group
has_many :posts
end
class Post < ActiveRecord::Base
acts_as_tree
belongs_to :user
end
Under the current acts_as_tree, each node can individually can relate hierarchically to other nodes provided they are of the same type. What I'd like is to remove this restriction on type identity, so that SomePost.parent could have a User or a Post as its' parent, and that SomeUser.parent could have another user or a group as its parent.
Any thoughts?
The way I have done this in the past is by using a polymorphic container that lives in the tree, mapping to specific individual models.
I managed to do it a little differently, but this might not work for your situation. I was refactoring existing code, and didn't want to do any serious database migrating.
I wanted separate leaf and node classes. Both inherit from a tree class.
I added two functions in ClassMethods in
vendor/plugins/acts_as_tree/lib/active_record/acts/tree.rb
:Then, in InstanceMethods, I just added one function:
That's a bit of a hack, but it works for me since every node has all one type of subs. You can play around with the
children
function to get different behavior, such as follows:But it still takes an extra query, and you lose your order and scopes and stuff.
Finally, in my Node class, I have
and in my Leaf class, the following:
Both of these inherit from TreeMatrix, which is pure virtual (nothing is actually instantiated as TreeMatrix, it's just a base class).
Again, this is very application-specific. But it gives you an idea how you can modify acts_as_tree.