Rails 4:如何使用has_many关联命名范围

时间:2013-09-13 17:40:10

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

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

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

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

project.videos.live.size

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

我看到它解释here将名称范围彼此链接应该与逻辑AND组合但是当应用于“关联方法”时[< - 不确定.videos的正确术语在这种背景下,似乎并没有发生。

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

2 个答案:

答案 0 :(得分:26)

我认为它应该在Rails 4中这样读:

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

rails 4 docs及其中的所有示例显示您将可调用对象传递给作用域以确保每次都调用它。如果它不能像这样工作,请尝试将其作为类方法实现,看看它是如何为您工作的。

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

答案 1 :(得分:3)

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

尝试:

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

然后:

project.videos.live.size

看看它是否有帮助。

有关详细信息,请阅读here