Ruby on Rails的空范围怎么实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

以下问题: 我需要空的范围。这意味着这个范围是静态的,但是对范围通常响应的所有方法做出响应。我目前正在使用一些蠢办法,我只是提供“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
提问于
用户回答回答于
User.where('false')

返回一个ActiveRecord::Relationship与零元素的关系,这是一个可链接的范围,在真正尝试访问它的一个元素之前,它不会去数据库。这类似于PhilT的解决方案(‘1=0’),但更优雅一些。

用户回答回答于

Rails 4引入了none范围。

它用于有一个返回关系的方法的实例,但有一种情况是不希望查询数据库。

如果你想要一个范围返回一个未改变的范围使用all

调用不再Model.all立即执行查询并返回记录数组。在Rails 4中,调用Model.all相当于现在已弃用的Model.scoped

扫码关注云+社区