根据 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 查询,那就是另一个问题了。
我需要根据两列对数据库中的记录进行排名 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 查询,那就是另一个问题了。