将特定项目移至上一个位置

时间:2015-12-29 13:36:31

标签: ruby-on-rails ruby activerecord

让模型Item包含属性idname以及名称为'other'的数据库中的特定记录。

如何在单个SQL查询中获取ActiveRecord::Relation对象,其中的项目按other项位于最后位置的方式排序? 作为临时解决方案,我使用Item.where.not(name: 'other') + Item.where(name: 'other'),但它会产生2个查询。

注意:它不是真正的代码,而是一个极其简化的例子。

3 个答案:

答案 0 :(得分:0)

也许下面的内容会有所帮助 - 我们会阅读所有Item,然后使用切片移除Item name等于other,然后将其追加到数组在最后。

a = Item.all.tap do |arr|
    arr << arr.slice!(arr.index { |t| t.name == "other"})
end

答案 1 :(得分:0)

如果我找到了你,那么你正在寻找一个SQL查询,对吧?然后你可以试试这样的东西:

select id, name
from (
  select id, name, decode(name, 'other', 999, 1) as sort 
  from items
)
order by sort

我现在没有数据库来测试语句。但我认为你明白了。

祝你好运

答案 2 :(得分:0)

已将类方法添加到Item模型:

def self.sorted
  find_by_sql("SELECT * FROM items ORDER BY (CASE name WHEN 'other' THEN 0 ELSE 1 END) DESC, id ASC")
end