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%')
x=0
cats.sort_by_name.each do |c|
   x += 1
   c.position = x
end

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=>parent_category.id)

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

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
      cat.save!()
      c_position = 0
      children = Category.where(:parent_category_id=>cat.id)
      children.order(:name).each do |c|
        c_position += 1
        c.position = c_position
        c.save!()
      end
    end
  end