前段时间又重新学习了一下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版本中,数据库管理与维护领域迎来了新的变革。微软公司在该版本中引入了若干新的数据定义语言(DDL)命令,新的架构设计以及一些功能强化的命令,这些改进特别在数据库索引维护方面表现明显。接下来...
这篇文档“200601-抛开偏见,正视保健品行业的投资机会_”可能为我们揭示了这一领域的诸多投资机遇与挑战。以下是根据标题和描述所推测的一些关键知识点: 1. **行业偏见与认知误区**:标题中的“抛开偏见”暗示了...
完全原生于Java和.NET 100% 面向对象, 抛开对象-关系映射 为嵌入式应用优化 开源,可以基于GPL协议免费使用.
### 抛开软件让笔记本电脑变身WiFi热点 #### 第一步:以管理员身份运行命令提示符 要实现笔记本电脑变身为WiFi热点,首先需要确保你具备管理员权限。这一步至关重要,因为接下来的操作涉及到对系统级别的配置修改。...
投资于保健品板块,投资者需要抛开偏见,正视该行业的投资机会。尽管保健品板块可能易受到短期政策及舆论波动的影响,但行业整体具有较高的防御性,主要源于其高频的消费模式、较高的利润贡献以及强防御性。保健品...
angularJs自身提供路由ng-router,但是ng-router不是很好用,配置项零散,好比Vue提供的组件传值一样,虽然提供给你了用法,但是开发过程中逻辑一多用着萌萌的,所以我们抛开ng-router来看ui-router。 引入ui-router ...
200601-抛开偏见,正视保健品行业的投资机会_.pdf
有一些数据库性能问题可能是因为同时启动的并行进程过多造成的,特别常见于RAC节点重启,很多时候是因为瞬间启动了几百... 抛开这个问题背后的其他因素不谈,我们单来讨论一下:一条SQL语句究竟会产生多少个并行进程
我认为抛开Objective-C单独谈论Swift是不准确的。因此我们先从Objective-C谈起。Objective-C语言是编写iOS/Mac程序的主要语言。编写iOS/Mac程序,除了Objective-C,还可以混合使用C/C++,另外也可以嵌入一些脚本语言...
【食品饮料行业保健品板块投资策略】报告主要探讨了中国保健品市场的发展现状、行业特性、投资机遇及风险,以下是对这些内容的详细解析: 1. **市场规模与增长**:中国的保健品市场已经成为全球第二大市场,2017年...
【互联网架构概述】 互联网架构是支撑大规模互联网应用的基础,它主要关注如何构建可扩展、高并发、高可用和数据驱动的系统。随着互联网行业的快速发展,传统的企业IT架构已无法满足实时处理海量数据和应对快速变化...
【标题】"初中语文文摘人生抛开纸枷锁"主要探讨的是个人在生活中面临的各种社会期望和束缚,以及如何寻求自由和自我实现的过程。【描述】中提到的"纸枷锁"指的是那些看似重要但实际上可以轻易挣脱的束缚,比如传统...
抛开偏见,正视保健品行业的投资机会”这一主题提示我们关注的是保健品行业在投资领域的潜力和挑战。保健品行业涵盖了众多领域,如营养补充剂、健康食品、传统中药等,是现代人追求健康生活的重要组成部分。投资者在...
物以稀为贵,请大家抛开金钱观念! 尝尝鲜,练练手,熟悉一下包Package、类Class、单例Singleton、 组件Component、方法Method、属性Property 、配置选项Config Option、事件Event 1.AdobeAIRInstaller.exe----- ...
本文将详细介绍如何在没有光驱支持的情况下,通过各种创新手段抛开光盘,安装操作系统。 首先,当用户面对光驱损坏、分区格式为NTFS、硬盘损坏等困境时,借助PE(预安装环境)工具和虚拟光驱技术,就可轻松进行操作...
2.100% 面向对象, 抛开对象-关系映射, 3.为嵌入式应用优化, 4.开源,可以基于GPL协议免费使用, 5.可嵌入db4o的原始Java和.NET对象数据库引擎到您的产品和商店,甚至更为复杂的对象结构而仅需要一行的编码!
在生活的长河中,我们时常会遇到各种色彩斑斓的景象,而其中的蓝色...让我们在教育孩子的过程中,也教会他们如何欣赏生活中的每一个简单而美好的瞬间,如何在任何情况下都保持乐观和积极,用爱和优雅去影响周围的世界。
X5官网中 关于TBS -> 平台适配 中已经写明了只支持armeabi、armeabi-v7a、arm64-v8a 这3种架构,因此对于x86等架构是不支持的(AS模拟器),抛开模拟器,大部分似乎只需提供armeabi架构就ok了。 微信中提取出来的这...