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")
=> [#, #]
irb(main):168:0* Subject.where(:position =>"2").class
=> ActiveRecord::Relation
irb(main):169:0> Subject.where(:position =>"2").to_sql
=> "SELECT `subjects`.* FROM `subjects` WHERE `subjects`.`position` = '2'"
irb(main):096:0> Subject.where("position=?","2").order("name desc")
=> [#, #]
下面说说where方法中的条件参数格式。
第一种是String,相当于直接传入SQL语句,为了防止SQL注入的风险,最好只用于硬编码或变量全部由我们自己控制的SQL语句,千万不要将用户输入的变量值直接放在语句里。
irb(main):160:0> Subject.where("position = '2' AND name='Second Subject'")
=> [#]
irb(main):161:0> Subject.where("position = ? AND name=?" ,"2","Second Subject")
=> [#]
irb(main):165:0> Subject.where(:position =>"2" ,:name=>"Second Subject")
=> [#]
所以选择用哪种条件表达式方式就得根据实际情况而定了,一般来说简单的查询使用Hash方式,当复杂性无法满足的时候使用Array型。至于String方式直接写SQL语句的最好还是别用了。
查询返回的结果可以当做一个Array使用,如果什么都没查到,返回的长度为0。
irb(main):172:0> Subject.where(:position =>"3")
=> []