让模型Item
包含属性id
,name
以及名称为'other'
的数据库中的特定记录。
如何在单个SQL查询中获取ActiveRecord::Relation
对象,其中的项目按other
项位于最后位置的方式排序?
作为临时解决方案,我使用Item.where.not(name: 'other') + Item.where(name: 'other')
,但它会产生2个查询。
注意:它不是真正的代码,而是一个极其简化的例子。
答案 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