【问题标题】:How to order by "merged" create_at of both a parent and associated model (Ruby on Rails, SQLite)如何通过父模型和关联模型(Ruby on Rails,SQLite)的“合并”create_at 进行排序
【发布时间】:2020-06-17 13:09:16
【问题描述】:

这就是问题所在。

我需要同时按线程的 create_at 和对线程的回复对线程(主题)进行排序(例如合并两个 create_at 列并按合并后的列排序)。

因此,它应该按照线程中的最后一个帖子排序,包括线程 OP-message 本身。

经过研究和实验,我能想到的最佳解决方案是:

topics.includes(:replies).order('replies.created_at DESC, topics.created_at DESC')

但这会将有回复的线程放在第一位,然后是没有回复的线程(即使它们是稍后创建的)。

基本上,我需要像图像板上的“凹凸”系统。我可以参考这个topic,我也需要这样做,但是在 Rails + SQLite 中。

请提供任何线索。谢谢!

【问题讨论】:

    标签: ruby-on-rails sqlite sql-order-by


    【解决方案1】:

    您可以启用belongs_to 关联的touch 选项:

    class Reply
      belongs_to :topic, touch: true
    end
    

    现在每次创建回复时,Topic 模型的updated_at 属性都会更新。

    因此,您可以简单地按主题表的updated_at 列进行排序:

    topics.order(updated_at: :asc)
    

    【讨论】:

    • 谢谢,Fabian,不知道这个功能。但是,在这种情况下它可能不起作用,因为要编辑主题(由管理员),因此更新 update_at,这不应该影响主题。
    • 太糟糕了。您可以将bumped_at 列添加到可用于此目的的Topic 模型。您需要向您的 TopicReply 类添加一个回调来处理 bumped_at 列。如果你愿意,我可以画出一个简单的解决方案。但是您的解决方案似乎也很好。
    • 一天结束时,我实现了您的解决方案(bumped_at 即控制器中的touched),因为我需要更多的碰撞选项(如sage 和碰撞限制)。当然,它更清洁。感谢您的提示,Fabian,我会将您的答案标记为已接受。
    【解决方案2】:

    经过一段编程萨满教后,我得到了解决方案。

    其实我只是将this answer 用于 SQL/PHP 并将其转换为 SQLite/Rails:

    topics.left_joins(:replies).group('topics.id').order(
              'IFNULL(MAX(replies.created_at), topics.created_at) DESC')
    

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多