`
darkbaby123
  • 浏览: 104230 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

让你的抛开SQL -- 优雅的MetaWhere

阅读更多

前段时间又重新学习了一下ASP.NET MVC,其实主要是.NET Framework 3.0时代的(忘了是3.0还是3.5了)LINQ比较吸引我。那种查询句法确实挺方便,而且可以不仅可以用来查询数据库,还可以查询数组,xml等东西(虽然配置起来没Rails那么简单智能)。比如一个例子:

 

var dc = new Northwind("connection_string");
var users = 
    from u in dc.Users
    where u.Name == "David" && u.Age > 20
    select u;

 

静态语言能做到这种程度实在不易。

相比之下,Rails的ActiveRecord默认的方法就要稍微不优雅一点,只要不是 = 的where条件都只能用SQL片段和参数:

 

users = User.where("name = ? and age > ?", "David", 20)

 

不过Ruby程序员都是不仅很重视效率,还很重视优雅的家伙,于是有人做了个叫MetaWhere的玩意,可以完全用Ruby语法书写SQL(估计用的Symbol的运算符重载)。挺有创意的,比如下面这样:

 

users = User.where(:name =~ "David", :age > 20)

 

而且这种语法并不是只是好玩,它完全可以支持比较复杂的联合查询,比如这个例子:

 

Article.where(
  :comments => {
    :body => 'yo',
    :moderations => [:value < 0]
  },
  :other_comments => {:body => 'hey'}
).joins(
  {:comments => :moderations},
  :other_comments
).to_sql

 

这会生成如下的SQL:

 

SELECT "articles".* FROM "articles"
INNER JOIN "comments" ON "comments"."article_id" = "articles"."id"
INNER JOIN "moderations" ON "moderations"."comment_id" = "comments"."id"
INNER JOIN "comments" "other_comments_articles"
  ON "other_comments_articles"."article_id" = "articles"."id"
WHERE (("comments"."body" = 'yo' AND "moderations"."value" < 0
  AND "other_comments_articles"."body" = 'hey'))

 

注意这里面的other_comments实际上只是一个关联,实际的表是comments。像这样的查询写where条件时是没法用Hash格式的参数的:

 

Article.joins("...").where(:other_comments => {:body => 'hey'})
# ActiveRecord会报错说找不到other_comments表,因为other_comments只是关联的名字,不是表名。

 

但MetaWhere可以很聪明的判断这一点。

 

本文不打算写成MetaWhere的教程,只是给大家介绍这个有趣的东东。因为官方的教程已经足够的好了。翻译一遍实在没什么必要。

感兴趣的同学可以去看 官方网站 。或者这个 asciicasts

 

 

分享到:
评论

相关推荐

    操作系统的另类安装--抛开光盘

    ### 操作系统的另类安装——抛开光盘 在日常生活中,我们经常通过光盘来安装操作系统,然而在没有光驱、软驱甚至是U盘的情况下,如何实现操作系统的安装呢?本文将详细介绍一种无需借助传统媒介(如光盘)即可完成...

    SQL Server 2005中的索引架构:抛开DBCC SHOWCONTIG,使用新的函数.pdf

    在SQL Server 2005版本中,数据库管理与维护领域迎来了新的变革。微软公司在该版本中引入了若干新的数据定义语言(DDL)命令,新的架构设计以及一些功能强化的命令,这些改进特别在数据库索引维护方面表现明显。接下来...

    200601-抛开偏见,正视保健品行业的投资机会_.rar

    这篇文档“200601-抛开偏见,正视保健品行业的投资机会_”可能为我们揭示了这一领域的诸多投资机遇与挑战。以下是根据标题和描述所推测的一些关键知识点: 1. **行业偏见与认知误区**:标题中的“抛开偏见”暗示了...

    db4o-64-net

    完全原生于Java和.NET 100% 面向对象, 抛开对象-关系映射 为嵌入式应用优化 开源,可以基于GPL协议免费使用.

    抛开软件让本本变身WiFi热点.docx

    ### 抛开软件让笔记本电脑变身WiFi热点 #### 第一步:以管理员身份运行命令提示符 要实现笔记本电脑变身为WiFi热点,首先需要确保你具备管理员权限。这一步至关重要,因为接下来的操作涉及到对系统级别的配置修改。...

    食品饮料行业保健品板块投资策略:抛开偏见,正视保健品行业的投资机会-1016-信达证券-60页.pdf

    投资于保健品板块,投资者需要抛开偏见,正视该行业的投资机会。尽管保健品板块可能易受到短期政策及舆论波动的影响,但行业整体具有较高的防御性,主要源于其高频的消费模式、较高的利润贡献以及强防御性。保健品...

    Angular路由ui-router配置详解

    angularJs自身提供路由ng-router,但是ng-router不是很好用,配置项零散,好比Vue提供的组件传值一样,虽然提供给你了用法,但是开发过程中逻辑一多用着萌萌的,所以我们抛开ng-router来看ui-router。 引入ui-router ...

    200601-抛开偏见,正视保健品行业的投资机会_.pdf

    200601-抛开偏见,正视保健品行业的投资机会_.pdf

    一条SQL语句究竟会产生多少个并行进程?

    有一些数据库性能问题可能是因为同时启动的并行进程过多造成的,特别常见于RAC节点重启,很多时候是因为瞬间启动了几百...  抛开这个问题背后的其他因素不谈,我们单来讨论一下:一条SQL语句究竟会产生多少个并行进程

    从Objective-C到Swift

    我认为抛开Objective-C单独谈论Swift是不准确的。因此我们先从Objective-C谈起。Objective-C语言是编写iOS/Mac程序的主要语言。编写iOS/Mac程序,除了Objective-C,还可以混合使用C/C++,另外也可以嵌入一些脚本语言...

    食品饮料行业保健品板块投资策略:抛开偏见,正视保健品行业的投资机会-20191016-信达证券-60页.pdf

    【食品饮料行业保健品板块投资策略】报告主要探讨了中国保健品市场的发展现状、行业特性、投资机遇及风险,以下是对这些内容的详细解析: 1. **市场规模与增长**:中国的保健品市场已经成为全球第二大市场,2017年...

    藏经阁-【云栖精选7月刊】抛开晦涩的算法、模型,让我们来谈谈互联网架构.pdf

    【互联网架构概述】 互联网架构是支撑大规模互联网应用的基础,它主要关注如何构建可扩展、高并发、高可用和数据驱动的系统。随着互联网行业的快速发展,传统的企业IT架构已无法满足实时处理海量数据和应对快速变化...

    初中语文文摘人生抛开纸枷锁

    【标题】"初中语文文摘人生抛开纸枷锁"主要探讨的是个人在生活中面临的各种社会期望和束缚,以及如何寻求自由和自我实现的过程。【描述】中提到的"纸枷锁"指的是那些看似重要但实际上可以轻易挣脱的束缚,比如传统...

    08.抛开偏见,正视保健品行业的投资机会_.rar

    抛开偏见,正视保健品行业的投资机会”这一主题提示我们关注的是保健品行业在投资领域的潜力和挑战。保健品行业涵盖了众多领域,如营养补充剂、健康食品、传统中药等,是现代人追求健康生活的重要组成部分。投资者在...

    Ext Designer Preview

    物以稀为贵,请大家抛开金钱观念! 尝尝鲜,练练手,熟悉一下包Package、类Class、单例Singleton、 组件Component、方法Method、属性Property 、配置选项Config Option、事件Event 1.AdobeAIRInstaller.exe----- ...

    操作系统的另类安装如何抛开光盘安装系统.pdf

    本文将详细介绍如何在没有光驱支持的情况下,通过各种创新手段抛开光盘,安装操作系统。 首先,当用户面对光驱损坏、分区格式为NTFS、硬盘损坏等困境时,借助PE(预安装环境)工具和虚拟光驱技术,就可轻松进行操作...

    android db4o 8.1

    2.100% 面向对象, 抛开对象-关系映射, 3.为嵌入式应用优化, 4.开源,可以基于GPL协议免费使用, 5.可嵌入db4o的原始Java和.NET对象数据库引擎到您的产品和商店,甚至更为复杂的对象结构而仅需要一行的编码!

    初中语文文摘人生蓝是月亮的优雅

    在生活的长河中,我们时常会遇到各种色彩斑斓的景象,而其中的蓝色...让我们在教育孩子的过程中,也教会他们如何欣赏生活中的每一个简单而美好的瞬间,如何在任何情况下都保持乐观和积极,用爱和优雅去影响周围的世界。

    x5内核静态打包方案43500-43656.zip

    X5官网中 关于TBS -&gt; 平台适配 中已经写明了只支持armeabi、armeabi-v7a、arm64-v8a 这3种架构,因此对于x86等架构是不支持的(AS模拟器),抛开模拟器,大部分似乎只需提供armeabi架构就ok了。 微信中提取出来的这...

Global site tag (gtag.js) - Google Analytics