ruby on Rails 命名范围实现

2024-06-22

摘自《使用 Rails 进行敏捷 Web 开发》一书

class Order < ActiveRecord::Base
   named_scope :last_n_days, lambda { |days| {:conditions =>
      ['updated < ?' , days] } }

   named_scope :checks, :conditions => {:pay_type => :check}
end

该声明

orders = Orders.checks.last_n_days(7)

将导致仅对数据库进行一次查询。

Rails 是如何实现这一点的呢?我是 Ruby 新手,我想知道是否有一个特殊的构造可以实现这种情况。

为了能够链接这样的方法,named_scope 生成的函数必须返回其自身或一个可以进一步限定作用域的对象。但是 Ruby 如何知道这是最后一个函数调用并且现在应该查询数据库呢?

我问这个问题是因为上面的语句实际上查询数据库,而不仅仅是返回由链接产生的 SQL 语句。


在named_scope 魔法中使用了两种技巧(或者模式,如果你愿意的话)。

代理模式- 在类或关联上调用命名范围方法always返回 ActiveRecord::NamedScope::Scope 类的实例,而不是过滤的 AR 对象的集合。这种模式虽然非常有用,但有时会使事情变得模糊,因为代理对象本质上是矛盾的。

延迟加载- 由于延迟加载(在这种情况下意味着 - 仅在必要时才访问数据库),命名范围可以链接到您需要使用范围定义的集合时的点。每当您请求底层集合时,都会评估所有链接的范围并执行数据库查询。

最后一点:在 IRB 中使用命名范围(或任何使用某种委托的事物)时需要记住一件事。每次你按下 Enter 时,你之前写的东西都会被评估,并且inspect方法在返回值上被调用。在链接命名作用域的情况下,尽管整个表达式被计算为 Scope 实例,但当 IRB 调用inspect方法,评估范围并触发数据库查询。这是由于以下事实造成的:inspect方法通过委托传播到所有作用域对象直至底层集合。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ruby on Rails 命名范围实现 的相关文章

随机推荐

  • Writeln 能够支持 Unicode 吗?

    考虑这个程序 APPTYPE CONSOLE begin Writeln Z end 使用 Consolas 字体的控制台上的输出是 Z Windows 控制台非常有能力支持 Unicode 如该程序所示 APPTYPE CONSOLE u
  • 四边形到矩形变换

    我想将四边形图像转换为我知道这些顶点的矩形图像 例如 在下图中 我知道坐标 X1 Y1 X4 Y4 和 x1 y1 x2 y2 并且我想将其转换为矩形 如何获得与四边形图像中的 X Y 坐标相对应的矩形图像中的 x y 坐标 gt Y gt
  • 构建 Ad Hoc iOS 应用程序时 OSStatus 错误 -67028

    当我尝试在 iOS 上为仅限 iPhone 的应用程序进行临时分发的存档构建时 出现错误 该应用程序使用正确的证书进行签名 并具有正确的配置文件 与也能够正确签名的朋友进行了检查 因此这不是代码签名问题 每当我尝试使用 Xcode 存档面板
  • 在 Recyclerview 上播放视频时遇到问题

    我在 RecyclerView 中有一个 VideoView 我希望最终有一个可以在 Recyclerview 上播放的视频列表 我决定从一个视频开始 然后再制作多个视频 我似乎无法在 Recyclerview 中播放任何视频 当我在手机上
  • magrittr 管道内的 enquo()

    我只是想了解这里出了什么问题 在第一种情况 工作 中 我分配enquo ted 变量的参数 在第二种情况下 我直接在调用中使用带引号的参数mutate library dplyr df lt tibble x 1 5 y 1 5 z 1 5
  • Java中的选择排序算法

    我在对数组进行排序时遇到一些问题 我正在尝试按升序对其进行排序 我的任务是从用户那里获取一系列整数并将它们存储到一个数组中 然后按升序将它们显示给用户 我很高兴从用户那里获取输入 将其存储在数组中并将其显示回来 我能够运行我的代码并获得我想
  • 从最终用户处获取 Internet Explorer 安全设置

    据报告 我们的网络应用程序存在问题 这些问题似乎只发生在一个客户的站点上 出于诊断目的 有什么方法可以让客户向您发送他们的 IE 安全自定义设置吗 例如在 IE 8 中 工具 gt Internet 选项 gt 安全选项卡 对于 Inter
  • 如何使用 C# 将数据从存储在 FTP 服务器上的 ZIP 文件导入到数据库

    此代码从 FTP 服务器导入 void dat 文件 现在 void dat 位于 archive zip 文件下 那么如何从数据库中的 archive zip 中提取并导入数据 void dat 呢 WebClient request n
  • 如何在 Rust 中使用条件编译宏的示例

    我已经关注了相当多 https doc rust lang org reference attributes html conditional compilation of 文档 https doc rust lang org stable
  • 对整个块使用异步管道和可观察的

    我有一个 Observable 它从 API 返回一个大对象 我需要在我的模板中显示这些值 对于以数组形式返回的其他数据 我可以使用 div p value prop p div 我不需要等待异步完成 ngFor 因为它的父元素中已经有一个
  • 将具有不同 id 的元素拖放到相应的放置区

    我有 12 个具有不同 id 的参数 我想将它们拖放到相应的云中 四朵云中的每一朵都至少有三个相应的参数 如果错误的参数被放入错误的云中 那么应该显示一条错误消息 并将错误的参数发送回初始占位符 到目前为止 我已经成功地对拖放进行了编码 但
  • Doctrine2 DBAL 存在查询

    我想请求你的帮助Doctrine2 DBAL查询构建于QueryBuilder 我习惯了 ORM 但我认为对于在侦听器中调用的此类查询来说 这是一种矫枉过正的做法 我需要查询SELECT EXISTS我不知道如何使用 DBAL 构建它Que
  • MP Android Chart-如何修复折线图中X轴值的数量?

    private void plotchart String s float f1 chart setBackgroundColor Color rgb 63 81 181 chart setDescription enable touch
  • 使用 Knockout 验证器添加 CSS 类

    我想将 CSS 类添加到select在我的视图元素中 我的视图模型有一个属性 我使用 Knockout Validation 扩展了该属性 self selectedRootCause ko observable extend requir
  • ASP.NET Web Api:项目需要 SQL Server Express

    我在VS 2010下创建了一个Web API项目 当我切换到 VS 2012 后 我总是收到警告 Web 项目 xxx 需要 SQL Server Express 但不需要 安装在这台计算机上 我不想安装此 SQL Server Expre
  • 如何修复 fxml 中的“无法派生 .jar 文件的模块描述符”错误

    我想从 JAR 库获取图像到我的项目中
  • HTML5:标题之前的元字符集?

    我经常看到这样的情况 将图表集定义放在标题标签之前重要吗 Thanks 是的 是的 请参阅https code google com p doctype mirror wiki MetaCharsetAttribute https code
  • ' Xamarin 表单' aria-label=''IAsyncOperation<>' Xamarin 表单'> 'IAsyncOperation<>' Xamarin 表单

    在 UWP 应用程序和 Xamarin Forms 应用程序中使用完全相同的代码时 我在 Xamarin Forms 程序上收到以下错误 但在 UWP 程序上则没有 错误 CS0012 在未引用的程序集中定义了类型 IAsyncOperat
  • Gradle - 排除文件与 jar 一起打包

    我想要exclude AMAuthN properties从构建的罐子中 该文件一直显示在编译后的 jar 的根文件夹中 该文件位于AMAuthN src main resources AMAuthN properties相对于项目文件夹根
  • ruby on Rails 命名范围实现

    摘自 使用 Rails 进行敏捷 Web 开发 一书 class Order lt ActiveRecord Base named scope last n days lambda days conditions gt updated lt