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