Ruby on Rails的空范围

Baj*_*aju 16 named-scope ruby-on-rails

以下问题:
我需要类似空范围的东西.这意味着此范围是emtpy,但响应范围通常响应的所有方法.我目前正在使用一些肮脏的黑客.我只是提供"1 = 0"作为条件.我觉得这很难看,因为它击中了数据库.简单地返回一个空数组是行不通的,因为结果必须响应作用域方法.

有没有更好的现有解决方案或我需要自己编码?

也许一些示例代码可以帮助解释我需要的东西:


class User < ActiveRecord::Base
  named_scope :admins, :conditions => {:admin => true }
  named_scope :none_dirty, :conditions => "1=0" # this scope is always empty

  def none_broken
    []
  end

  def self.sum_score # okay, a bit simple, but a method like this should work!
    total = 0
    self.all.each do |user|
      total += user.score
    end
    return total
  end
end
User.admin.sum_score # the score i want to know
User.none_drity.sum_score # works, but hits the db
User.none_broken.sum_score # ...error, since it doesn't respond to sum_score
Run Code Online (Sandbox Code Playgroud)

Pau*_*eon 21

Rails 4引入了none范围.

它将在您有一个返回关系的方法的实例中使用,但有一种情况是您不希望查询数据库.

如果您希望范围返回未更改的范围,请使用all:

不再调用Model.all立即执行查询并返回记录数组.在Rails 4中,调用Model.all等同于现在已弃用Model.scoped.这意味着可以链接更多关系,Model.all并且结果将被懒惰地评估.


bou*_*der 11

User.where('false')
Run Code Online (Sandbox Code Playgroud)

返回一个具有零元素的ActiveRecord :: Relation,这是一个可链的范围,在您实际尝试访问其中一个元素之前,它不会命中数据库.这与PhilT的解决方案类似('1 = 0'),但更优雅一点.


Baj*_*aju 0

您正在寻找的东西不存在。您可以通过对方法进行修补来实现类似的功能find。然而,这太过分了,所以我建议保留它,除非它对性能至关重要。