【问题标题】:Rails 4: how to use named scope with has_many associationsRails 4:如何将命名范围与 has_many 关联一起使用
【发布时间】:2013-09-13 17:40:09
【问题描述】:

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

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

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

project.videos.live.size

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

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

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

【问题讨论】:

  • 首先检查 Video.live.size 返回的是什么
  • @SabyasachiGhosh 它正在返回“实时”视频的总数。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 我是 Ruby/Rails 的新手,之前没见过 -> 语法。是标准的 Ruby 还是 Rails 添加的东西?
  • 我(有限的)理解是它是 Rails 4 的新功能。我记得我的 Rails 3 项目中的范围肯定不需要像那样传递对象。我的假设也得到了 Rails 3 指南的支持:guides.rubyonrails.org/v3.2.13/…,它没有显示对象被传递到任何范围,所以这对我来说是有保证的。
  • 您绝对正确,这是 Rails 4 的东西,因为当我在没有它的情况下编写范围时,我在日志中看到了贬损警告。但我的后续问题实际上只是关于 -> 运算符本身。我以前没见过它,我只是想了解它是什么。
  • @Emerson - -> 是“Stabby Lambda”的语法。传统 lambda 块的简写。
  • @veritas1 谢谢!!我怀疑是这样的。
【解决方案2】:

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

试试:

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

然后:

project.videos.live.size

看看有没有帮助。

欲了解更多信息,请阅读here

【讨论】:

  • 请注意......范围和类方法的行为不同
  • 链接的文章已过期。作者对其进行了编辑,说提到的错误已修复,并且他将作用域用于简单的事情。来自rails docs 4.1“这(范围)与定义类方法完全相同,您使用的是个人喜好问题”
猜你喜欢
  • 1970-01-01
  • 2014-06-01
  • 2016-08-23
  • 1970-01-01
  • 2011-06-06
  • 2014-07-06
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
相关资源
最近更新 更多