- 浏览: 239425 次
文章分类
最新评论
-
bluky999:
中间的兼职例子很逗 哈哈哈
tornado: web.py 之 Application -
flingfox63:
学习了,详细,赞个
Ruby变量作用域的类目录结构 -
zhou6711411:
不知是版本问题还是怎么的
class A
...
Ruby变量作用域的类目录结构 -
t284299773:
你在方法中定义方法就相当于在方法中调用lambda!
Ruby变量作用域的类目录结构(补二) -
lnj888:
很是有用 不错Powerpoint converter
一个简单的link_to,ROR到底在背后做了些什么?(未完)
原文出处:http://railsontherun.com/2007/9/16/ambition-why-should-you-care
By now, you should have heard about ambition if not read the latest post from the author.
Ambition has a simple goal: making you stop writing SQL in your queries and only stick to Ruby. (who cares if you use ActiveRecord, Sequel, DataMapper or another ORM)
I'm so used to the ActiveRecord way of querying the database that I was not fully convinced that Ambition would help me in my daily tasks. I still gave it a try:
Testing Ambition
$ sudo gem install ambition -y
Started my console
$ script/console
and required Ambition
require 'ambition'
I started by doing a query the AR way:
1 2 |
Photo.find(:all, :conditions => "photos.title IS NULL AND photos.width > 250 AND photos.height > 200 AND users.name = 'test'", :include => :user) |
And I converted it into an Ambition call:
|
Photo.select {|p| p.title == nil && p.width > 250 && p.height > 200 && p.user.name == 'test'}.entries |
145 vs 102 keystrokes. 30% less typing with Ambition! I don't know about you, but I REALLY prefer the Ruby only query, much cleaner and much "DRYer". However, that's not always true:
|
Photo.find_by_title(nil) |
(24chars)
|
Photo.detect{|p| p.title == nil} |
But what's going on behind the scene? Do we have the exact same SQL query sent to our DB?
Well, Ambition doesn't generate any SQL, it uses AR to do so. You want to make sure Ambition is not messing with you, try that:
1 2 |
>> Photo.select {|p| p.title == nil && p.width > 250 && p.height > 200 && p.user.name == 'test'}.to_hash => {:conditions=>"(photos.`title` IS NULL AND (photos.`width` > 250 AND (photos.`height` > 200 AND users.name = 'test')))", :include=>[:user]} |
That's pretty hot. Especially when you have to use eager loading!
Obviously you can still do stuff like that:
1 2 3 |
Photo.select {|p| p.title == nil && p.width > 250 && p.height > 200 && p.user.name == 'test'}.each do |photo| puts photo.filename end |
(note the query will only be made once)
Another cool thing, is to do simple sorting:
|
>> Photo.select {|p| p.title == nil && p.user.name == 'test'}.sort_by { |p| [p.created_at, -p.size] } |
creates the following:
|
=> {:order=>"photos.created_at, photos.size DESC", :conditions=>"(photos.`title` IS NULL AND users.name = 'test')", :include=>[:user]} |
or
|
=> "SELECT * FROM photos JOIN user WHERE (photos.`title` IS NULL AND users.name = 'test') ORDER BY photos.created_at, photos.size DESC"
|
That's cool, and you can still sort on relationships:
1 2 3 4 5 6 7 |
>> Photo.select {|p| p.title == nil }.sort_by { |p| p.user.name } => "SELECT * FROM photos JOIN user WHERE photos.`title` IS NULL ORDER BY users.name"</macro:code > Or directly on the model: <macro:code lang="ruby">>> Photo.sort_by(&:title) => "SELECT * FROM photos ORDER BY photos.title" |
To finish, another detail which makes Ambition a great library
1 2 3 |
>> Photo.any? {|p| p.title =~ /ambition/ } => "SELECT count(*) AS count_all FROM photos WHERE (photos.`title` REGEXP 'ambition')" => true |
And if you were worried that it wouldn't work with utf8, check this out:
1 2 3 4 5 6 |
>> Photo.any? {|p| p.title == 'école'} => SET NAMES 'utf8' => SET SQL_AUTO_IS_NULL=0 => SHOW FIELDS FROM photos => SELECT count(*) AS count_all FROM photos WHERE (photos.`title` = 'école') => false |
Limitations
The only limitation I found in Ambition is that Ruby code won't work in the block, for instance:
|
>> Photo.select {|p| p.title == nil && p.created_at < 1.week.ago && p.user.name == 'test'}.entries |
won't work at the moment. To inspect what's going simply try:
1 2 |
>> Photo.select {|p| p.title == nil && p.created_at < 1.week.ago && p.user.name == 'test'}.to_sql => "SELECT * FROM photos JOIN user WHERE (photos.`title` IS NULL AND (photos.`created_at` < 1.`week`.`ago` AND users.name = 'test'))" |
You can see that photos.created_at
< 1.week
.ago
is the problem.
The recommended way to achieve the same result is to use variables:
1 2 3 |
>> date = 1.week.ago >> Photo.select {|p| p.title == nil && p.created_at < date && p.user.name == 'test'}.to_sql => "SELECT * FROM photos JOIN user WHERE (photos.`title` IS NULL AND (photos.`created_at` < '2007-09-08 19:38:48' AND users.name = 'test'))" |
However, note that method calls will work just fine:
1 2 3 4 5 6 |
>> def time_now_please >> Time.now >> end >> Photo.select {|p| p.title == nil && p.created_at < time_now_please && p.user.name == 'test'}.to_sql => "SELECT * FROM photos JOIN user WHERE (photos.`title` IS NULL AND (photos.`created_at` < '2007-09-15 19:41:37' AND users.name = 'test'))" |
Conclusion
For now, Ambition is still just wrapping ActiveRecord::Base#find but the plan is to actually generate SQL. Hopefully we'll also be able to use Ruby code from within an Ambition block. Kickers methods are very interesting and could become a really nice way of speeding up your app and keep your code clean.
Ambition is a great query library, I think I'll start using it whenever I have "find" calls with multiple conditions especially if my conditions are related to another model. However I still didn't figure out how to use an inner join with Ambition.
发表评论
-
(ZZ)Ror on svn
2007-12-20 19:34 1469正好需要,zz过来,抄袭自:http://www.surui. ... -
用GetText来进行ROR的国际化和本地化
2007-11-22 15:17 1410IBM developerWorks上的一篇文章,直接贴地址, ... -
advanced act_as_solr
2007-10-31 19:40 1758原文出处:http://www.quarkruby.com/2 ... -
act_as_solr
2007-10-31 19:39 1936原文出处:http://www.quarkruby.com/2 ... -
使用Inkscape提供自己的pdf服务
2007-10-31 19:34 1496原文出处:http://www.thesatya.com/bl ... -
给will_paginate加上ajax效果
2007-10-31 19:30 2109原文出处:http://railsontherun.com/2 ... -
使用rails制作图表
2007-10-31 19:21 2756原文出处:http://www.railsontherun.c ... -
如果定制attachment_fu上传文件的路径和文件名
2007-10-31 16:59 2711原文出处:http://the.railsi.st/2007/ ... -
attachment_fu使用指南
2007-10-31 16:56 3164原文出处:http://clarkware.com/cgi/b ... -
(ZZ)Cache in Rails
2007-09-25 15:49 1468很经典的文章,留在blog里面做个收藏 Ruby on Rai ... -
(ZZ)Ruby on Rails Security Guide
2007-09-24 21:28 2610Ruby on Rails Security Gui ... -
学到三招
2007-09-24 01:54 1356第一招:用ruby-debug来调试rails程序 具体使用方 ... -
一个action的process过程
2007-09-17 00:11 2479ruby 代码 def process(req ... -
在线查看rails代码和edge rails api的网址,备份,以免忘记
2007-09-14 18:38 1279Edge Rails API: http://caboo.se ... -
总是看到returning,这到底是个什么东东,查了一下找到了源代码
2007-09-14 18:37 1339A Ruby-ized realization of the ... -
一个简单的link_to,ROR到底在背后做了些什么?(未完)
2007-09-14 18:20 3415滥用link_to会造成ror程序 ... -
学到关于include的一点儿知识
2007-08-23 18:09 1115ruby 代码 module Test ... -
在一个controller中render另外一个controller中view的时候出现问题
2007-08-21 18:27 2124我想在posts这个controller中的show.rh ... -
因为Rjs试用NetBeans
2007-06-20 09:44 1087因为昨天看Rails Recipe的时候提到了rjs,于是四处 ...
相关推荐
AMBITION安邦信G7 P7系列变频器说明书
AMBITION-QMS质量管理信息系统介绍V21汇编.pdf
Company_name:Ambition Box 上列出的 公司名称。 描述:对公司的简要描述,通常来自其简介或网站。 评分:用户在 Amb ition Box 上提供的公司的总体评分。 Highly_rated_for: 用户高度评价的公司领域或方面。 ...
AMBITION安邦信G11系列变频器说明书
AMBITION安邦信AMB-E11系列变频器说明书
AMBITION安邦信AMB-V11系列变频器说明书
AMBITION安邦信AMB-HVI高压系列变频器说明书
Americans ambition 英语课前演讲PPT课件PPT学习教案.pptx
python库。 资源全名:ambition-prn-0.1.8.macosx-10.13-x86_64.tar.gz
python库。 资源全名:ambition-ae-0.3.2.macosx-10.13-x86_64.tar.gz
资源来自pypi官网。 资源全名:ambition_visit_schedule-0.1.18-py3-none-any.whl
资源来自pypi官网。 资源全名:ambition_rando-0.1.40-py3-none-any.whl
资源来自pypi官网。 资源全名:ambition_edc-0.3.46-py3-none-any.whl
资源分类:Python库 所属语言:Python 资源全名:ambition_edc-0.3.14-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
资源分类:Python库 所属语言:Python 资源全名:ambition_rando-0.1.18-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059