根据 Rails 中的多个条件自定义排名

Custom ranking based on multiple criteria in Rails

我需要根据两列对数据库中的记录进行排名 table:

availability_date

updated_at

它们都是日期时间类型的列,但是排名条件在时间上不是线性的。因此,例如,在 0 到 10 的范围内,'updated_at' 值:

14 到 30 天前会得到 10,

而 13 到 9 天前会得到 9.5,

31 到 60 将得到 9,

等等

'availability_date' 列也是如此。

最终 ranking/ordering 结果应该是每条记录的两个量表值的平均值。

我正在尝试在控制器中编写该逻辑,理想情况下希望避免在数据库中添加列来构建索引。

我正在使用 Ruby 2.5.1 和 Rails 5.2。

有人知道这是否可行吗?

非常感谢。

就你目前的问题来看,当然是可行的。尝试使用 sort_by,在其中提供指定如何对数据进行排序的块。

在此块中,您应该准确地编写您所陈述的逻辑:将日期转换为一个值,具体取决于它的年龄并获取这两个值的平均值。

我可以想象这样的事情:

def date_to_val(date)
  days_ago = (Time.now - date).to_i / 1.day
  return 10 if days_ago.between?(14, 30)
  return 9.5 if days_ago.between?(9, 13)
  return 9 if days_ago.between?(31, 60)
  # and so on
end

def my_controller_action
  @records = SomeClass.where(some_attr: some_val)
  ordered = @records.sort_by do |e| 
    [
      date_to_val(e.created_at), 
      date_to_val(e.availability_date)
    ].sum / 2.0
  end
  # do something with ordered
end

现在,如果您想纯粹使用 SQL 查询,那就是另一个问题了。