首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ruby on Rails为空作用域

Ruby on Rails为空作用域
EN

Stack Overflow用户
提问于 2010-09-17 21:45:48
回答 7查看 6.7K关注 0票数 16

以下问题:

我需要一个空范围之类的东西。这意味着这个作用域是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
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-11-14 04:01:00

你要找的东西不存在。你可以通过monky为find方法打补丁来实现类似的东西。然而,这可能是一种过度的杀伤力,所以我建议保留它,除非它是性能关键的。

票数 0
EN

Stack Overflow用户

发布于 2014-04-11 21:01:55

Rails4引入了none作用域。

它用于这样的情况:您有一个返回关系的方法,但在某些情况下,您不希望查询数据库。

如果希望作用域返回未更改作用域,请使用all

Model.all的调用不再会立即执行查询并返回记录数组。在Rails4中,对Model.all的调用等同于现在不推荐使用的Model.scoped。这意味着可以将更多的关系链接到Model.all,并且将延迟计算结果。

票数 23
EN

Stack Overflow用户

发布于 2013-02-07 21:30:50

User.where('false')

返回一个零元素的ActiveRecord::Relation,这是一个可链接的作用域,直到您实际尝试访问它的一个元素时才会访问数据库。这类似于PhilT使用('1=0')的解决方案,但更优雅一些。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3735838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档