以下问题:
我需要一个空范围之类的东西。这意味着这个范围是空的,但响应范围通常响应的所有方法。
我目前正在使用一些肮脏的技巧。我只是提供“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
最佳答案
Rails 4 引入了 none
范围。
它用于您有一个返回关系的方法的情况,但存在您不希望查询数据库的情况。
如果您希望范围返回未更改的范围,请使用 all
:
不再调用Model.all
立即执行查询并返回记录数组。在 Rails 4 中,调用 Model.all
相当于现在不推荐使用的 Model.scoped
.这意味着更多的关系可以链接到Model.all
。并且结果将被懒惰地评估。
关于ruby-on-rails - Ruby on Rails 的空作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3735838/