19

在我的 Rails 4 应用程序项目(模型)has_many视频(模型)中。我在视频模型中有一个命名范围:

scope :live, where( is_deleted: 0, sent_to_api: 1 )

在我的一个项目视图中,我这样做(项目是项目的一个实例):

project.videos.live.size

我期望得到的是该特定项目中的项目数量,但我得到的是任何项目中的视频数量。好像.live不是从其中返回子集,.videos而是替换它。

我在这里看到它解释说,将命名范围相互链接应该与逻辑 AND 结合,但是当应用于“关联方法”[<--不确定.videos在这种情况下的正确术语] 时,这似乎没有发生。

这样做的正确方法是什么?

4

2 回答 2

26

我相信它在 Rails 4 中应该是这样的:

scope :live, -> { where(is_deleted: 0, sent_to_api: 1) }

rails 4 文档及其中的所有示例都向您展示了将可调用对象传递给范围以确保每次都调用它。如果它不能像这样工作,请尝试将其实现为类方法,看看它对你来说是如何工作的。

http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html

于 2013-09-13T17:47:57.393 回答
3

我只会选择类方法并留下范围。语法要简单得多,因为它就像任何其他类方法一样,包括向其传递参数。

尝试:

def self.live
  where( is_deleted: 0, sent_to_api: 1 )
end

接着:

project.videos.live.size

看看它是否有帮助。

欲了解更多信息,请阅读此处

于 2013-09-13T19:32:33.070 回答