def self.sort(_sort_items, _collection)
return _collection unless _sort_items
_collection.sort! do |first_item, second_item|
side_one = []
side_two = []
_sort_items.each do |sort_item|
a = first_item.send(sort_item.item_name)
b = second_item.send(sort_item.item_name)
if sort_item.descending
side_one << b
side_two << a
else
side_one << a
side_two << b
end
end
side_one <=> side_two
end
end
我想以更简洁/时尚的方式编写此方法
#sort
方法采用多个属性的集合和顺序。
如果我有@collection
这样的话:
和@sort_items
:
@sort_items.add_item(:gender, true)
@sort_items.add_item(:age, false)
如果我执行:
MyClass.sort(@sort_items, @collection)
我会得到:
首先按gender desc
排序,然后按age asc
排序。
我使用纯红宝石,但包括Active Support
答案 0 :(得分:0)
至于简洁和风格,你的代码实际上看起来很不错。它组织良好,可读性强。
我确实看到了一种优化性能的方法:如果我正确理解方法,那么如果你有一个平局,你只需要进入下一级_sort_items
(即两个项目都是比较的相同:“F”vs“F”)。因此,只要两个项目不同,您就可以提前退货:
_sort_items.each do |sort_item|
a = first_item.send(sort_item.item_name)
b = second_item.send(sort_item.item_name)
if sort_item.descending
side_one << b
side_two << a
else
side_one << a
side_two << b
end
return side_one <=> side_two if a != b
end
我唯一的另一个建议就是要注意方法过长。这个超过20行,你应该考虑将一些逻辑分成一个单独的方法。也许是这样的:
_sort_items.each do |sort_item|
a = first_item.send(sort_item.item_name)
b = second_item.send(sort_item.item_name)
add_to_sides(a, b, side_one, side_two)
return side_one <=> side_two if a != b
end
.
.
.
def add_to_sides(a, b, side_one, side_two)
.
.
.
end