0

我有一个 Post 模型和一个 View 模型(记录用户对每个帖子的视图),如下所示:

class View < ActiveRecord::Base
    belongs_to :user, :class_name => 'User'
    belongs_to :post, :class_name => 'Post'
    validates_uniqueness_of :user_id, :scope =>:post_id
end

每个帖子都有一个名为“special”的布尔字段。

我想获取具有以下排序条件的所有帖子:

  1. 如果一个帖子是“特殊的”并且当前用户没有查看(比如 user_id=2),那么它应该出现在结果的顶部,内部按 id 降序排序)。
  2. 根据帖子的 id 字段对所有其他帖子(非特殊和查看特殊)进行排序。

无法弄清楚我是否以及如何做到这一点。

首先,我尝试了以下查询:

posts = Post.order("(case when special = true then 'special desc, id desc' else 'id desc' end)")

但它的行为方式很有趣:返回顶部的所有特殊帖子,然后是常规帖子,但 id 按升序排序。

我在这里想念什么?另外,如何使用带有如此复杂的 order by 子句的连接(用于视图表)?我试图为此编写一个 SQL,但也在那里苦苦挣扎!给我看点光:)

PS我是Rails的新手,还在学习。

4

1 回答 1

2

您发布的代码是,对于每一行,计算 2 个字符串文字中的一个,并根据这些文字进行排序,这就是为什么您没有得到您想要的示例的原因。我会做类似的事情

Post.order('special desc, id desc')

由于 Rails 在 MySQL 中将布尔字段存储为 0/1,这会将特殊帖子排序在非特殊帖子之前。

向其中添加视图并不会改变很多:您需要离开加入视图表并执行类似的操作

Post.joins('left join views on posts.id=post_id and user_id=2').order(' ( views.id is null && special)  desc, id desc')

检测是否找到了一个视图,该is null视图随后与帖子的特殊性相结合。

于 2012-07-21T23:22:10.277 回答