如何使用给定值“推进”记录?

时间:2012-12-10 11:46:19

标签: mysql ruby-on-rails ruby ruby-on-rails-3

我正在使用Ruby on Rails 3.2.9和MySQL。我有Article模型,其user_id属性(此属性代表外键 - id - 用于关联的作者用户),我想检索订购这些" for&的文章#34;给定的作者。也就是说,鉴于我有以下记录:

<#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>

当我查找订购的文章&#34; for&#34;作者使用id 1user_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>

换句话说,我希望检索所有文章,但要使用此&#34;优先级&#34;:创建的订购文章鉴于作者首先返回,然后是所有其他文章(也就是说,我希望&#34;推进&#34;由给定作者创建的文章)。

我该怎么做?


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

4 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

尝试:

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

或者这个:

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

答案 2 :(得分:0)

试试这个::

Select 
*
from 
myTable
order by 
user_id, id

对于给定的user_id:

Select 
*
from 
myTable
where user_id='?'
order by 
user_id, id

答案 3 :(得分: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)")