gpt4 book ai didi

ruby-on-rails - 条件 order_by 取决于 Sunspot 中的数据

转载 作者:行者123 更新时间:2023-12-02 02:04:50 25 4
gpt4 key购买 nike

我想知道是否有一种方法可以使用某种 if/then 语义来排序。

我要解决的基本要求是:

  • 我的记录有一个 contact_again_time 时间属性,可以是 nil
  • 列表的排序方式应该是,所有确实有 contact_again_time 的记录首先按 contact_again_time 降序排列。
  • contact_again_time 为 nil 的其余部分应按 created_at 升序排列。

所以在我的脑海中,我可以通过让我的 searchable 看起来像这样将订单字段具体化到索引中来解决这个问题:

integer :sort_key do                                                                                                                                             
contact_again_time.nil? ? (created_at.to_i * -1) : contact_again_time.to_i
end

然后执行 order_by(:sort_key, :desc) 以获得我想要的。但是通过这种方式,我将部分排序逻辑放在我的模型中,更重要的是放在 Lucene 索引中。

我宁愿避免的事情,因为它感觉很不对。

最佳答案

在 Solr 中,您可以通过在查询中添加 sort 参数来实现:sort=contact_again_time desc,created_at asc

只要 contact_again_time 出现,它就会按降序排序(并使用 created_at 来打破平局,这与您无关)。当仅存在 created_at 时,它们将按升序排序。

这应该直接转化为太阳黑子。

更新:如果你想像 sort=contact_again_time asc,created_at asc 这样排序,你会首先得到缺少 contact_again_time 的文档,就像您在下面的评论中提到的那样。要将这些文档推到最后,请将 sortMissingLast="true" 添加到 Solr schema.xml 中的 contact_again_time。如果 created_at 也可能在某些文档中不存在,并且您想要相同的行为,您也应该向其添加 sortMissingLast

关于ruby-on-rails - 条件 order_by 取决于 Sunspot 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15617647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com