filter children with acts_as_tree

Hello Experts, I have a tree of categories in this category object there is a property called type. the root categories have no type but the children have. so how I can get all the roots with filled in children that have category type = 'B' for instance. I tried to run Category.roots then delete children With a category not equal to 'B' but this causes a major performance problems.

how to call roots with filter children?

best regards Ibrahim

This is how children is defined[1]:

has_many :children, class_name:  name,

foreign_key: configuration[:foreign_key],

order:       configuration[:order],

dependent:   configuration[:dependent],

inverse_of:  :parent

If you do: root.children.where(:type => yourtype) it should just work.

[https://github.com/amerine/acts_as_tree/blob/master/lib/acts_as_tree.rb#L7](https://github.com/amerine/acts_as_tree/blob/master/lib/acts_as_tree.rb#L89)8

Not answering the question but I would avoid using a field named 'type'. Rails expect this to be used with STI and may become confused if it used as a normal field.

Colin

Thanks for all your answers i will test this and give you a feedback can i use a scope for this also?

Hello, It didn't work i want to bring all roots that a children have one type not only one root. something like @categories = Category.roots but with children condition category_type => '2'

Can you please help me with this.

Best regards

Sorry if this is a double post but I had browser issues.

I had a similar problem and this is how I solved it.

First, switch to the awesome_nested_sets gem. After installing the gem, you will need to add a couple fields and run a rebuild command. See the instructions here -> https://github.com/collectiveidea/awesome_nested_set/wiki/Converting-Acts_As_Tree-to-Awesome_Nested_Set

My nested set is called 'Library' and I only wanted users to see libraries that were either created for their company or not assigned to any company (ie. library.company_id == user.company_id or library.company_id == nil).

I created this user method:   def libraries     libraries = Library.arel_table

Library.where(libraries[:company_id].eq(nil).or(libraries[:company_id].eq(self.company_id)))   end

And call it from the controller using:   @libraries = current_user.libraries.order('lft ASC')

In the view, I create a table and then use the jquery.treeTable.js to created a widget that allows for easy navigation of the tree/sets.

Hello, thanks for your advice, however i wanted all the roots chould parent should be always nil, but in the same time I want the children for this roots to be filtered only with a specific type. root1-       child1 type A       child2 type B root2      child3 type A      Child4 type B

when i apply the filter on type A the result should be as follows:

root1      child1 root2      child3

Can someone help me with this?

best regards