ActiveRecord" none"用NullRelation实现的方法?

时间:2015-07-23 07:24:39

标签: ruby-on-rails activerecord

我想了解none中引入的Rails4方法。

以下是Rails API

的实施方案
def none
  where("1=0").extending!(NullRelation)
end

我在Rails3方式中找到了类似的实施here

scope :none, where(:id => nil).where("id IS NOT ?", nil)

任何人都可以帮助我了解这种方法是如何在NullRelation中使用Rails4来实现的吗?

1 个答案:

答案 0 :(得分:1)

让我们先检查ActiveRecord::NullRelation

它们基本上设置为所有方法的常量值,因此无论您将要使用什么,都不会命中数据库。

请记住,当您将方法链接到某个关系时,每次都获得一个新关系,这意味着,一旦您点击[^\t]*,所有未来的方法都会尝试建立一个关系一。很容易想象他们在数据库中找不到任何内容,只会继续noneself)。

此外,考虑到您已经链接了当前的实现,很明显他们将继续返回NullRelation,但显然由于ActiveRecord::Relation方法而找不到任何内容。然而关键点在于'1=0'方法,它将覆盖 ActiveRecord :: Relation instance 的方法(不是所有关系,因此就像Ruby中的单例实例一样)强制它不要命中数据库(extending!被一个简单的空数组替换为返回值。)