我正在为ActiveRecord模型编写模块。简而言之,它是一种可以调用一系列where
,join
和order
语句的方法。这些陈述在撰写时尚不清楚,因此无法使用范围。到目前为止它运作良好,但有一点我想改进。
这是我的方法:
def filter
rel = respond_to?(:filter_scope) ? filter_scope : where(1)
# Do other stuffs with `rel`
# ...
rel
end
如果已定义,则首先调用filter_scope
,或者从目标模型获取ActiveRecord::Relation
。为此,我使用where(1)
强制模型返回关系对象。只要我直接在模型(filter
)或关系(User.filter
,User.order(:name).filter
等)上调用User.my_scope.filter.order(:age)
,这就行得很好。)
但使用where(1)
有点肮脏。在Rails 3中,我将使用all
代替它,但它在Rails 4中被折旧。有关如何改进这一点的任何想法?
提前致谢
注意:我无法将where(1)
替换为self
,因为self
可能会返回filter
,而User.filter
可能是一个类,因此不能用作查询对象。
答案 0 :(得分:1)
在Rails 3中,我将使用all,但它在Rails 4中被折旧。
我不认为all
已弃用,它曾用于返回Array
(rails 3),现在返回ActiveRecord::Relation
,因此您应该能够将其用于链接查询
请参阅http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html#method-i-all
返回一个ActiveRecord :: Relation范围对象。