sorting a ruby array of objects by an attribute that could be nil sorting a ruby array of objects by an attribute that could be nil ruby ruby

sorting a ruby array of objects by an attribute that could be nil


I would just tweak your sort to put nil items last. Try something like this.

foo = [nil, -3, 100, 4, 6, nil, 4, nil, 23]foo.sort { |a,b| a && b ? a <=> b : a ? -1 : 1 }=> [-3, 4, 4, 6, 23, 100, nil, nil, nil]

That says: if a and b are both non-nil sort them normally but if one of them is nil, return a status that sorts that one larger.


I handle these kinds of things like this:

 children.sort_by {|child| [child.position ? 0 : 1,child.position || 0]}


How about in Child defining <=> to be based on category.position if category exists, and sorting items without a category as always greater than those with a category?

class Child  # Not strictly necessary, but will define other comparisons based on <=>  include Comparable     def <=> other    return 0 if !category && !other.category    return 1 if !category    return -1 if !other.category    category.position <=> other.category.position  endend

Then in Parent you can just call children.sort.