我有一个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”的布尔字段。
我想获取具有以下排序条件的所有帖子:
无法弄清楚我是否以及如何做到这一点。
首先,我尝试了以下查询:
posts = Post.order("(case when special = true then 'special desc, id desc' else 'id desc' end)")
但它表现得很有趣:返回顶部的所有特殊帖子,然后是常规帖子,但ids按升序排序。
我在这里缺少什么?另外,如何使用具有如此复杂的order by子句的join(for views table)?我试图为此写一个SQL,但也在那里挣扎!给我看一些亮点:)
P.S我是Rails的新手,还在学习。
答案 0 :(得分: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
检测是否找到了一个视图,然后使用帖子的特殊性来查看该视图。