有没有办法按字母顺序排列记录,排除一条记录,最后我想要的?
class Category < ActiveRecord::Base
default_scope -> { order(:name) }
end
我总是希望名为“其他”的类别在最后。
答案 0 :(得分:2)
您可以尝试以下ActiveRecord查询
Category.order("CASE WHEN name = 'Other' then 0 else 1 END DESC, name ASC")
答案 1 :(得分:1)
这有点棘手。在SQL中,您可以add CASE
statements to your ORDER BY
。在您的情况下,SQL将类似于。
SELECT *
FROM categories
ORDER BY
(
CASE
WHEN name = 'Other' THEN 1
ELSE 0
END
)
这是live example。
据我所知,ActiveRecord order
方法接受任意字符串,因此可以(未经测试)能够将案例传递给方法
Category.order("CASE WHEN name = 'Other' ... ")
这种方法看起来很复杂,但是如果能让它工作到目前为止效率最高。
第二种选择是与ActiveRecord一起玩。
class Category < ActiveRecord::Base
def self.ordered(condition = nil)
# Get the ID of the record to exclude
excluded = self.where(name: 'Other').pluck(:id).first
# order the records and collect the ids
ids = where('id <> ?', excluded).order(condition).pluck(:id)
# append the excluded at the end
ids << excluded
# recreate the scope and return it.
where(id: ids)
end
end
Category.where(...).ordered
一般来说,我建议您避免使用ActiveRecord中的default_scopes
。添加它们非常容易,但在需要时很难将它们删除。
答案 2 :(得分:0)
我建议只添加一个额外的字段“位置”并按其排序。或者您可以通过2个字段(位置,名称)进行排序。所有类别的位置等于= 0,而“其他”等于999,例如