Ruby on Rails,使用where方法對持久化對象進行條件查詢

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", posit
ion: "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", posit
ion: "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", posit
ion: "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", posit
ion: "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", posit
ion: "2">]

所以選擇用哪種條件表達式方式就得根據實際情況而定了,一般來說簡單的查詢使用Hash方式,當複雜性無法滿足的時候使用Array型。至於String方式直接寫SQL語句的最好還是別用了。

查詢返回的結果可以當做一個Array使用,如果什麼都沒查到,返回的長度爲0。

irb(main):172:0> Subject.where(:position =>"3")
=> []

http://blog.csdn.net/abbuggy/article/details/8094043

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章