我想了解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
来实现的吗?
答案 0 :(得分:1)
让我们先检查ActiveRecord::NullRelation
它们基本上设置为所有方法的常量值,因此无论您将要使用什么,都不会命中数据库。
请记住,当您将方法链接到某个关系时,每次都获得一个新关系,这意味着,一旦您点击[^\t]*
,所有未来的方法都会尝试建立一个关系一。很容易想象他们在数据库中找不到任何内容,只会继续none
(self
)。
此外,考虑到您已经链接了当前的实现,很明显他们将继续返回NullRelation
,但显然由于ActiveRecord::Relation
方法而找不到任何内容。然而关键点在于'1=0'
方法,它将覆盖 ActiveRecord :: Relation instance 的方法(不是所有关系,因此就像Ruby中的单例实例一样)强制它不要命中数据库(extending!
被一个简单的空数组替换为返回值。)