Ruby on Rails,使用where方法对持久化对象进行条件查询
来源:互联网 发布:网络呆梨是什么意思 编辑:程序博客网 时间:2024/06/03 21:11
http://blog.csdn.net/abbuggy/article/details/8094043
在《Ruby on Rails,使用find方法加载持久化对象》一文中,我们使用find系列方法进行对象查询。在新版本的Rails中,都推荐使用where而不是find方法进行条件查询了。
语法上和find条件查询差不多,应该说更简洁一点,比如我想找到position是2的对象。
irb(main):090:0> Subject.where("position=?","2").order("name")=> [#<Subject id: 4, created_at: "2012-10-20 15:14:07", updated_at: "2012-10-20 15:17:46", name: "Fourth Subject", position: "2">, #<Subject id: 2, created_at: "2012-10-20 06:25:27", updated_at: "2012-10-20 15:10:36", name: "Second Subject", position: "2">]
与find方法不同的是,where方法返回的结果不是数组而是ActiveRelation,这意味着我们可以基于当前的查询结果继续设置条件进行查询。
irb(main):168:0* Subject.where(:position =>"2").class=> ActiveRecord::Relation
并且,通过to_sql方法我们能看到Rails将我们的条件转换成的SQL语句以便于调试。
irb(main):169:0> Subject.where(:position =>"2").to_sql=> "SELECT `subjects`.* FROM `subjects` WHERE `subjects`.`position` = '2'"
比如第一步先检索出position是2的所有对象,然后再根据name降序排列等等。
irb(main):096:0> Subject.where("position=?","2").order("name desc")=> [#<Subject id: 2, created_at: "2012-10-20 06:25:27", updated_at: "2012-10-20 15:10:36", name: "Second Subject", position: "2">, #<Subject id: 4, created_at: "2012-10-20 15:14:07", updated_at: "2012-10-20 15:17:46", name: "Fourth Subject", position: "2">]
与find的另一点不同是,where是懒加载的。也就可以理解为通过where方法返回对象只是一个壳子,里面什么都没有,直到我们需要从这个对象中取得属性值这一刻才会真的查询数据库。如果想要关闭懒加载特性,在where调用之后增加.all即可。
下面说说where方法中的条件参数格式。
第一种是String,相当于直接传入SQL语句,为了防止SQL注入的风险,最好只用于硬编码或变量全部由我们自己控制的SQL语句,千万不要将用户输入的变量值直接放在语句里。
irb(main):160:0> Subject.where("position = '2' AND name='Second Subject'")=> [#<Subject id: 2, created_at: "2012-10-20 06:25:27", updated_at: "2012-10-20 15:10:36", name: "Second Subject", position: "2">]
第二种是Array,第一个参数和需要写的SQL语句格式完全一样,字段值的地方用?问号代替。后面的参数按照顺序提供条件值。
irb(main):161:0> Subject.where("position = ? AND name=?" ,"2","Second Subject")=> [#<Subject id: 2, created_at: "2012-10-20 06:25:27", updated_at: "2012-10-20 15:10:36", name: "Second Subject", position: "2">]
第三种是Hash,每个参数都是一套值对。这种方式非常简单直观,不过有点局限就是表现力有点差,只能表示AND,无法表示OR。
irb(main):165:0> Subject.where(:position =>"2" ,:name=>"Second Subject")=> [#<Subject id: 2, created_at: "2012-10-20 06:25:27", updated_at: "2012-10-20 15:10:36", name: "Second Subject", position: "2">]
所以选择用哪种条件表达式方式就得根据实际情况而定了,一般来说简单的查询使用Hash方式,当复杂性无法满足的时候使用Array型。至于String方式直接写SQL语句的最好还是别用了。
查询返回的结果可以当做一个Array使用,如果什么都没查到,返回的长度为0。
irb(main):172:0> Subject.where(:position =>"3")=> []
http://blog.csdn.net/abbuggy/article/details/8094043
- Ruby on Rails,使用where方法对持久化对象进行条件查询
- Ruby on Rails,使用where方法对持久化对象进行条件查询
- Ruby on Rails,使用where方法对持久化对象进行条件查询
- Ruby on Rails,使用find方法加载持久化对象
- 《Ruby on Rails,使用find方法加载持久化对象
- Ruby on Rails,链式调用order,limit,offset方法对条件查询结果进行整理
- Ruby on Rails,使用save和update_attributes更新持久化的ActiveRecord对象
- Ruby on Rails,使用destroy方法删除ActiveRecord对象
- Ruby on Rails 查询数据库 where 和 find 的区别
- ruby on rails 的数据库查询方法
- ruby on rails 的数据库查询方法
- rails 查询 where条件用法
- Ruby on Rails,使用Rails Console进行ActiveRecord调试
- Ruby on Rails 使用 Cookie 的方法
- ruby on rails使用
- 使用rbenv进行Ruby on Rails 环境搭建@CentOS 7-2-Ruby on Rails测试
- 自己总结的ruby on rails 查询方法
- ruby on rails 优化rails查询
- Java书籍Top 10
- Windows Server 2008 R2中安装SQL Server R2以支持SC2012_VMM
- vc++基于UDP的对话程序
- (7)21.2.3并发 练习3
- catalog备份数据库
- Ruby on Rails,使用where方法对持久化对象进行条件查询
- 信号量PV操作
- RMAN FORMAT字符串格式化
- Error: can not register my instance state - -1
- linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析
- MFC线程的创建与互斥
- ZOJ 1649.Rescue
- HDU 4203
- git 彩色显示