gpt4 book ai didi

ruby-on-rails - ActiveRecord "none"方法是如何使用 NullRelation 实现的?

转载 作者:行者123 更新时间:2023-12-04 06:03:31 25 4
gpt4 key购买 nike

我想了解 none Rails4中介绍的方法.

这是来自 Rails API 的实现

def none
where("1=0").extending!(NullRelation)
end

我发现了类似的实现 hereRails3道路。
scope :none, where(:id => nil).where("id IS NOT ?", nil)

谁能帮我理解这个方法是如何用 NullRelation 实现的在 Rails4和优势?

最佳答案

我们先查一下ActiveRecord::NullRelation

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

请记住,当您在关系上链接方法时,您 建立新关系 每次,这意味着,一旦您点击 none ,所有 future 的方法都将尝试从该方法建立关系。很容易想象,他们不会在数据库中找到任何东西,只会不断返回 self ( NullRelation )。

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

关于ruby-on-rails - ActiveRecord "none"方法是如何使用 NullRelation 实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31580712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com