我需要基于两列对数据库表中的记录进行排名:
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。
有人知道这是否可行吗?
非常感谢。
答案 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查询来执行此操作,那么这是另一个问题。