我正在使用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
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>
换句话说,我希望检索所有文章,但要使用此&#34;优先级&#34;:创建的订购文章鉴于作者首先返回,然后是所有其他文章(也就是说,我希望&#34;推进&#34;由给定作者创建的文章)。
我该怎么做?
注意:我正在寻找Ruby on Rails实现,可能是通过order
方法。
答案 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)")