按属性的子字符串(时间)对记录进行排序

时间:2018-07-11 22:32:04

标签: ruby-on-rails sorting

我有这个活动记录查询:

shop = Shop.find(12934)

然后我像这样从这家商店买了一系列产品

@product_templates = []

shop.products.each do |product|
  @product_templates.push(product.template)
end

所以现在我有一个活动记录对象数组,如下所示:

[
 #<Product::Template id: 185549, name: "1:30pm", position: 0>, 
 #<Product::Template id: 185522, name: "11:30am", position: 1>,
 #<Product::Template id: 185580, name: "7:00pm", position: 2>, 
 #<Product::Template id: 185556, name: "10:00am", position: 3>,
]

我想通过按名称排序每个position的时间来更新Product::Template属性,例如

10:00 am、11:30am、1:30pm、7:00pm是对象的顺序,因此10:00 am对象将获得位置:0,7:00 pm将获得位置:3,依此类推。

我该怎么做?谢谢您的时间

2 个答案:

答案 0 :(得分:1)

尝试一下:

@product_templates.sort { |t1, t2| Time.strptime(t1, "%I:%M%P") <=> Time.strptime(t2, "%I:%M%P") }.each_with_index { |template, index| product.position = index }

我要做的是先对模板数组进行排序,然后根据数组索引更新位置。

答案 1 :(得分:0)

首先,在排序之前填充@product_templates的方法不是一个好方法。

@product_templates =
shop.products
.map(&:template)
.sort_by{|template| template.name.to_time}