如何使用给定值“推进”记录?
我正在使用Ruby on Rails 3.2.9和MySQL。 我有一个带有user_id
属性的Article
模型(此属性表示外键 – 用于关联作者用户的id
),我想检索为给定作者“订购”的文章。 也就是说,鉴于我有以下记录:
...
当我查找为id
1
( user_id = 1
)的作者订购的文章时,应该按照以下顺序对退回的文章进行排序:
...
换句话说,我希望检索所有文章,但是使用这个“优先级”进行排序 : 由给定作者创建的文章首先返回,然后是所有其他文章 (也就是说,我想“推进”由鉴于作者)。
我该怎么做?
注意 :我正在寻找Ruby on Rails实现,可能通过order
方法。
你的例子不是那么清楚,因为你正在搜索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。
尝试:
Article.where(user_id: 1).order("user_id ASC").order("id ASC")
或这个:
Article.where(user_id: 1).order("user_id ASC, id ASC")
试试这个 ::
Select * from myTable order by user_id, id
对于给定的user_id:
Select * from myTable where user_id='?' order by user_id, id
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)")