ActiveRecord更改或重置在范围中定义的排序

时间:2014-12-14 15:28:11

标签: ruby-on-rails activerecord

我有一个使用另一个函数输出的函数:一个ActiveRecord :: Relation对象。这个关系已经有一个订单条款:

# This function cannot be changed
def black_box
  Product.where('...').order("name")
end

def my_func
  black_box.order("id")
end

当我执行关系时,订单函数对ORDER_BY子句进行排序:

SELECT * FROM products
WHERE ...
ORDER_BY('name', 'id') // The first order function, then the second

有没有什么方法可以指定在上一个之前插入我的订单功能的关系?那么SQL会是这样的吗?

SELECT * FROM products
WHERE ...
ORDER_BY('id', 'name')

1 个答案:

答案 0 :(得分:10)

您可以使用reorder方法重置原始订单并按列添加新订单。

<强>重排序(*参数)

用指定的顺序替换在关系上定义的任何现有订单。

User.order('email DESC').reorder('id ASC') # generated SQL has 'ORDER BY id ASC'

将追加对同一关系的后续调用。例如:

User.order('email DESC').reorder('id ASC').order('name ASC')
# generates a query with 'ORDER BY id ASC, name ASC'.