Rails4:从模型或已链接的关系中获取ActiveRecord :: Relation

时间:2014-05-10 13:08:40

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

我正在为ActiveRecord模型编写模块。简而言之,它是一种可以调用一系列wherejoinorder语句的方法。这些陈述在撰写时尚不清楚,因此无法使用范围。到目前为止它运作良好,但有一点我想改进。

这是我的方法:

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.filterUser.order(:name).filter等)上调用User.my_scope.filter.order(:age),这就行得很好。)

但使用where(1)有点肮脏。在Rails 3中,我将使用all代替它,但它在Rails 4中被折旧。有关如何改进这一点的任何想法?

提前致谢


注意:我无法将where(1)替换为self,因为self可能会返回filter,而User.filter可能是一个类,因此不能用作查询对象。

1 个答案:

答案 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范围对象。