Sort Categories by name

(Jay Pfaffman) #1

I need to sort all of the subcategories in a category by name.

Something like

cats = Category.find_by_sql("select * from categories where name like '%whatever%')
cats.sort_by_name.each do |c|
   x += 1
   c.position = x

is there some Discourse way or should I just be asking at StackOverflow?

(David Taylor) #2

I am by no means a ruby expert, but I think this is a sensible way:

parent_category = Category.where(:name=>"Whatever").first

children = Category.where(:parent_category_id=>

x = 0
children.order(:name).each do |c|
   x += 1
   c.position = x!()

that’ll output the name of each of the children of parent_category, and assign their position alphabetically.

I tried it on the console and it worked - but I provide no guarentee it won’t cause your server to set on fire or similar :wink:

(Jay Pfaffman) #3

Thanks, @david! That was a huge help.

This will find all categories that match search and sort them and the subcategories that they contain.

  def sort_matching_subcategories(search)
    categories = Category.where("name like ?", search)
    position = 100
    categories.order(:name).each do |cat|
      position += 1
      cat.position = position!()
      c_position = 0
      children = Category.where(:parent_category_id=>
      children.order(:name).each do |c|
        c_position += 1
        c.position = c_position!()