Rails 4命名范围,记录总是在末尾

时间:2013-12-20 15:37:46

标签: ruby activerecord ruby-on-rails-4

有没有办法按字母顺序排列记录,排除一条记录,最后我想要的?

class Category < ActiveRecord::Base

  default_scope -> { order(:name) }

end

我总是希望名为“其他”的类别在最后。

3 个答案:

答案 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,例如