Rails,如何排序一个集合,并在最后保留一个特定的值



我有一些对象的活动记录集合…

#<CoverElement:0x00007f87a4d78718
id: 312,
title: "Title 1",
link: "",
coverable_id: 35001,
coverable_type: "Article",
created_at: Thu, 07 May 2020 16:55:00 CEST +02:00,
updated_at: Thu, 07 May 2020 16:55:00 CEST +02:00,
cover_id: 4,
format: "small",
custom_image: nil,
position: 2,
second_title: nil,
second_title_url: nil>,
#<CoverElement:0x00007f87a4d6fde8
id: 313,
title: "Title 2",
link: "",
coverable_id: 35010,
coverable_type: "Article",
created_at: Thu, 07 May 2020 16:55:00 CEST +02:00,
updated_at: Sun, 22 Nov 2020 19:33:39 CET +01:00,
cover_id: 4,
format: "horizontal",
custom_image: nil,
position: 3,
second_title: nil,
second_title_url: nil>

对于网站的桌面版本,我使用的位置作为订单,但我需要另一个订单的移动版本。我需要按格式和"小"排序。一定是最后一次。

基本上格式可以是:"large" vertical" horizontal"one_answers"small".

我试试

@elements.reorder('format ASC')

,它可以工作,但当然它会保持这个顺序&;horizontal&;, &;large&;, &;vertical&;和"small">

所有带有"small"As格式必须在末尾。有没有办法做到这一点,或者我必须写一个自定义排序方法?

您将需要另一个移动版本的排序方法。但是,如果您按格式排序,它将执行字母数字排序,这不会给您想要的结果("small"是去年)。

有两种方法可以获得您想要的顺序:

第一种方法是将格式列重铸为enum,以便数据库包含整数值。

class CoverElement < ActiveRecord::Base
enum format: [ :large, :vertical, :horizontal, :small ]
end

如果这是不可能的,你可以做一个SQL片段,像这样:

order = <<-ORD.squish
CASE
WHEN 'format'='large' THEN 4
WHEN 'format'='vertical' THEN 3
WHEN 'format'='horizontal' THEN 2
WHEN 'format'='small' THEN 1
END
ORD
CoverElement.order(order)

相关内容

  • 没有找到相关文章

最新更新