Ven*_* Ch 7 activerecord ruby-on-rails
我想了解none介绍的方法Rails4.
这是从中实现的 Rails API
def none
where("1=0").extending!(NullRelation)
end
Run Code Online (Sandbox Code Playgroud)
而且我发现类似的实现这里的Rails3方法.
scope :none, where(:id => nil).where("id IS NOT ?", nil)
Run Code Online (Sandbox Code Playgroud)
谁能帮助我了解这个方法是如何与实施NullRelation中Rails4和优势?
我们首先检查ActiveRecord::NullRelation
它们基本上将所有方法设置为常量值,因此无论您要使用什么,都不会访问数据库。
请记住,当您在一个关系上链接方法时,您每次都会得到一个新的关系none,这意味着,一旦您点击,所有未来的方法都将尝试从该关系建立一个关系。很容易想象他们不会在数据库中找到任何内容,只会继续返回self(NullRelation)。
此外,考虑到您已经链接了当前的实现,很明显它们将继续返回一个ActiveRecord::Relation,但显然由于该'1=0'方法它不会找到任何东西。然而,关键点在于该extending!方法,它将通过强制它不访问数据库来覆盖ActiveRecord::Relation 实例(不是所有关系,因此这就像 Ruby 中的单例实例)的方法(exec_queries被替换为一个简单的空数组作为返回值)。
| 归档时间: |
|
| 查看次数: |
443 次 |
| 最近记录: |