【问题标题】:Rails 4.0 way to unscope the default_scope at another scope definition (with_exclusive_scope depreciated)Rails 4.0 在另一个范围定义中取消 default_scope 范围的方法(with_exclusive_scope depreciated)
【发布时间】:2014-09-16 02:30:52
【问题描述】:

这可能是一个非常简单的问题,但我一直试图了解如何在 Rails 4.0 中做到这一点。基本上,它是User has_many Post 的基本用户和发布应用程序。此外,在每个帖子中都有一个布尔值:images_to_process。它的作用是表明所有属于这个Post 的图像是否已经被delayed_jobs 处理。不应显示不完整的帖子以避免图像加载问题。这是适用于 Rails 3 的代码:

class Post < ActiveRecord::Base
  default_scope { where(is_deleted: false, images_to_process: 0) }
  scope :everything, -> user {with_exclusive_scope { where(is_deleted: false, user_id: user) }}

您可能已经注意到,with_exclusive_scope 在 Rails 4 中已被贬值。我知道使用类方法可能更容易做到这一点,但我不想放弃范围可链接和可扩展的便利。我应该怎么做才能替换 Rails 4 中的with_exclusive_scope

感谢阅读

【问题讨论】:

  • 这不是问题的答案,而是一个建议。根本不要使用 default_scope。它在应用程序的整个生命周期中引起的头痛比它实际解决的问题要多得多。并且使用 rescope 或其他技术来删除以前的默认关系似乎不是很干。
  • 确实如此。最初我仍然选择 default_scope 因为我认为在大多数情况下,这是真的。我不想对所有正常的邮政电话都要​​求 Post.active 。无论如何,这似乎应该是要走的路(考虑到范围的语法通过 RoR 3 到 4 到 4.1 有很多变化)
  • 其实如果scope不与default_scope的定义合并,一切问题都会迎刃而解!为什么default_scope会这样设计?...

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


【解决方案1】:

您应该使用unscoperescope。更多信息请见http://guides.rubyonrails.org/active_record_querying.html#overriding-conditions

【讨论】:

  • 谢谢!但是,好像 unscope 和 rescope 只能用在方法中,不能用在作用域定义部分?
  • 谢谢。我会尝试把它升级到 4.1。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 2011-11-28
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多