基于Rails中的多个条件的自定义排名

时间:2018-11-22 15:30:44

标签: ruby-on-rails ranking

我需要基于两列对数据库表中的记录进行排名:

  

availability_date

  

updated_at

它们都是datetime类型的列,但是排名的条件在时间上不是线性的。因此,例如,以0到10的比例,“ updated_at”值:

在14天到30天之间可以获得10,

而13到9天前将达到9.5,

31到60等于9,

“ availability_date”列也是如此。

最终的排名/排序结果应该是每条记录的两个标度值的平均值。

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

我正在使用Ruby 2.5.1和Rails 5.2。

有人知道这是否可行吗?

非常感谢。

1 个答案:

答案 0 :(得分: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查询来执行此操作,那么这是另一个问题。