【发布时间】:2018-07-14 12:21:56
【问题描述】:
我想按相关对象的属性值对 ActiveRecord 对象数组进行排序。意思是这样的:
项目有一个具有属性 SKU 的产品。 SKU 主要是存储为字符串的整数,但也可以是字母数字。
sorted = items.sort_by { |item| Integer(item.product.sku) } rescue items
目前,如果出现错误,原始订单的商品将退回。
我想做什么?
扩展 Array 类以实现类似:
items.numeric_sort { |item| item.product.sku }
到目前为止我做了什么?
1.构建一个lambda表达式并传递它
class Array
def numeric_sort(&lambda)
if lambda.respond_to? :call
self.sort_by(&lambda) rescue self
else
self.sort_by { |el| Integer(el) } rescue self
end
end
end
product_bin = lambda { |task_item| Integer(item.product.bin) }
items.numeric_sort(&product_bin)
2。从方法链构建 lambda 表达式
class Object
def send_chain(keys)
keys.inject(self, :send)
end
end
class Array
def numeric_sort_by(*args)
(args.length == 1) ? lam = lambda {|el| Integer(el.send(args))} : lam = lambda {|el| Integer(el.send_chain(args))}
self.sort_by(&lam) rescue self
end
end
items.numeric_sort_by(:product, :sku)
这一切有意义吗?
如果可能的话,能否请您指出正确的方向来实现我上面提到的语法。
谢谢。
编辑:sku 也可以是字母数字。很抱歉造成混乱。
【问题讨论】:
-
关闭,但我想要一个热门的建议来实现所需的语法。谢谢。
-
你能提供一个
items数据样本吗? -
@iGian items = [ {id: 1, product: {sku: "6234324"}, {id: 2, product: {sku: "342343}}] .. 实际上这些是 AR对象不是哈希。
-
为什么不
items.sort_by { |item| item.product.sku.to_i }?如果 sku 不是有效的整数字符串,则不会失败。
标签: ruby-on-rails arrays ruby sorting