在调用关系的类方法中返回原始关系

时间:2018-09-04 19:32:15

标签: ruby-on-rails ruby activerecord collections

我在名为order_by_ids(ids)的模型上有一个类方法,该方法由ActiveRecord Relation调用。下面是其用法示例:

User.where(id: [1,2,3]).order_by_ids([2,1,3])

...将按以下顺序返回用户1、2和3:[2,1,3]

如果传递一个空数组,我希望它返回原始关系(基本上什么也不做)。

以下内容返回整个类,而不仅仅是返回它所调用的关系:

return self unless ids.present?

以下内容可以100%起作用,但是看起来不太优雅。另外,我认为它会运行不必要的查询(无论如何在控制台中似乎都比较慢):

return where.not(id: nil) unless ids.present?

是否有一种快速的方法来返回它所调用的关系?从理论上讲,我可以将其设置为一个范围,但是已经教我避免使用带参数的范围(请参阅this指南以供参考)。

注意:我正在使用Rails 3,所以all返回一个数组。我实际上是在寻找all的Rails 4版本。

1 个答案:

答案 0 :(得分:1)

以下内容应保留上游范围链(返回all,而不是self):

return all if ids.none?

P.S。命名范围是一种完全可接受的传统查询处理方式。