gpt4 book ai didi

ruby - 是否可以根据单个对象对方法的响应对对象列表进行排序?

转载 作者:数据小太阳 更新时间:2023-10-29 06:43:13 24 4
gpt4 key购买 nike

我想显示一个产品 的画廊,其中包括待售和非待售产品。只是我想让待售的产品出现在列表的前面,而不是待售的对象出现在列表的末尾。

我实现此目的的一种简单方法是制作两个列表,然后合并它们(一个列表是 on_sale? 对象,另一个列表是非 on_sale? 对象):

available_products = []
sold_products = []
@products.each do |product|
if product.on_sale?
available_products << product
else
sold_products << product
end
end

. . .但是对于我现有应用程序的结构来说,由于我的代码中有一个奇怪的地方,这将需要过多的重构(我失去了分页,我宁愿不重构)。如果有一种方法可以通过我的 product 模型的方法 on_sale? 返回一个 bool 值来对现有对象列表进行排序,那就更容易了。

是否可以更优雅地遍历现有列表并根据 rails 中的真值或假值对其进行排序?我之所以问,是因为其中隐藏了太多我不知道的东西框架/语言(ruby),我想知道他们的工作是否在我之前完成。

最佳答案

当然。理想情况下,我们会使用 sort_by! 做这样的事情:

@products.sort_by! {|product| product.on_sale?}

或者更时髦

@products.sort_by!(&:on_sale?)

但遗憾的是,<=>不适用于 bool 值(参见 Why doesn't sort or the spaceship (flying saucer) operator (<=>) work on booleans in Ruby? )和 sort_by不适用于 bool 值,所以我们需要使用这个技巧(感谢 rohit89!)

@products.sort_by! {|product| product.on_sale? ? 0 : 1}

如果你想变得更漂亮,sort方法采用一个 block ,在该 block 内您可以使用您喜欢的任何逻辑,包括类型转换和多个键。尝试这样的事情:

@products.sort! do |a,b|
a_value = a.on_sale? ? 0 : 1
b_value = b.on_sale? ? 0 : 1
a_value <=> b_value
end

或者这个:

@products.sort! do |a,b|
b.on_sale?.to_s <=> a.on_sale?.to_s
end

(将 b 放在 a 之前,因为您希望 "true" 值位于 "false" 之前)

或者如果您有次要排序:

@products.sort! do |a,b|
if a.on_sale? != b.on_sale?
b.on_sale?.to_s <=> a.on_sale?.to_s
else
a.name <=> b.name
end
end

请注意 sort返回一个新的集合,这通常是一个更干净、更不容易出错的解决方案,但是 sort! 修改原始集合的内容,您说这是一项要求。

关于ruby - 是否可以根据单个对象对方法的响应对对象列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14814966/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com