1

我正在使用 Ruby on Rails 3.2.9 和 MySQL。我有一个Article带有user_id属性的模型(此属性代表外键 -id用于关联作者用户),我想检索订购那些“为”给定作者的文章。也就是说,鉴于我有以下记录:

<#Article id: 1, title: "Title 1", user_id: 1>
<#Article id: 2, title: "Title 2", user_id: 2>
<#Article id: 3, title: "Title 3", user_id: 1>
<#Article id: 4, title: "Title 4", user_id: 3>
<#Article id: 5, title: "Title 5", user_id: 1>
...
<#Article id: N, title: "Title N", user_id: M>

id 1当我查找使用( )为作者“为”订购的文章时user_id = 1,返回的文章应按如下顺序排列:

<#Article id: 1, title: "Title 1", user_id: 1>
<#Article id: 3, title: "Title 3", user_id: 1>
<#Article id: 5, title: "Title 5", user_id: 1>
<#Article id: 2, title: "Title 2", user_id: 2>
<#Article id: 4, title: "Title 4", user_id: 3>
...
<#Article id: N, title: "Title N", user_id: M>

换句话说,我希望检索所有文章,但按此“优先级”排序:给定作者创建的文章首先返回,然后是所有其他文章(也就是说,我想“推进”由给定的作者)。

我怎样才能做到这一点?


注意:我正在寻找一个 Ruby on Rails 实现,可能是通过该order方法。

4

4 回答 4

2

您的示例并不那么清楚,因为您正在搜索 user_id 1 并且 user_id 的正常排序无论如何都会将它们放在首位。我相信你的意思是做这样的事情:

SELECT id, title, user_id
FROM myTable
ORDER BY CASE WHEN user_id = @search_id THEN 1 ELSE 2 END, user_id

在你上面的例子中,@search_id应该是 1。

于 2012-12-10T11:49:40.360 回答
1

尝试:

Article.where(user_id: 1).order("user_id ASC").order("id ASC")

或这个:

Article.where(user_id: 1).order("user_id ASC, id ASC")
于 2012-12-10T11:53:05.117 回答
0

Rails 中的查询可能是这样的:

Article.order(Article.send(:sanitize_sql, ["IF(user_id = ?, 1, 2)", params[:user_id]]))

IF(user_id = ?, 1, 2)返回 1 或 2 用于订购商品。sanitize_sql,一个私有方法,用于清理参数。

如果 params[:user_id] 始终是整数,则查询可以简化为:

Article.order("IF(user_id = #{params[:user_id].to_i}, 1, 2)")
于 2012-12-10T14:51:35.650 回答
0

尝试这个 ::

Select 
*
from 
myTable
order by 
user_id, id

对于给定的 user_id:

Select 
*
from 
myTable
where user_id='?'
order by 
user_id, id
于 2012-12-10T11:48:34.363 回答