Ruby on Rails,使用find方法加載持久化對象

歡迎來我的博客http://blog.csdn.net/abbuggy/article/details/8092928

前文Ruby on Rails,使用new和create創建ActiveRecord對象及他們之間的區別Ruby on Rails,使用save和update_attributes更新持久化的ActiveRecord對象Ruby on Rails,使用destroy方法刪除ActiveRecord對象中,分別介紹了向數據庫中創建、更新、刪除對象的方法。在應用實踐中,從數據庫查詢對象的機會要遠遠高於創建、修改、刪除的機會。下面來看看如何通過find方法加載ActiveRecord對象。

之前我們就已經使用過類似於Subject.find(1)的方法從數據庫中加載Subject對象了。這是find的最簡單用法,傳入主鍵,得到對應的對象實例。

irb(main):015:0* subject = Subject.find(1)
=> #<Subject id: 1, created_at: "2012-10-20 06:14:56", updated_at: "2012-10-20 06:14:56", name: "First Subject", position: nil>
irb(main):016:0>

如果傳入的主鍵id對應的記錄並不存在,將會拋出異常通知"RecordNotFound: Couldn't find Subject with id=2"以便進行後續處理。關於異常處理在後面會有所涉及,在這裏只要知道主鍵查詢這種方式有可能拋出異常即可。

irb(main):019:0* subject = Subject.find(2)
ActiveRecord::RecordNotFound: Couldn't find Subject with id=2
        from E:/greensoft/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/relation/finder_methods.rb:340:in `find_one'
        from E:/greensoft/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/relation/finder_methods.rb:311:in `find_with_ids'
        from E:/greensoft/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/relation/finder_methods.rb:107:in `find'
        from E:in `find'
        from (irb):19
        from E:/greensoft/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands/console.rb:47:in `start'
        from E:/greensoft/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands/console.rb:8:in `start'
        from E:/greensoft/RailsInstaller/Ruby1.9.3/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands.rb:41:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'

通過all方法,可以返回所有對象的列表。

irb(main):051:0* Subject.all
=> [#<Subject id: 1, created_at: "2012-10-20 06:14:56", updated_at: "2012-10-20 06:14:56", name: "First Subject", position: nil>, #<Subject id: 2, created_at: "2012-10-20 06:25:27", updated_at: "2012-
10-20 06:25:27", name: "First Subject", position: nil>]

通過first和last方法,可以分別返回數據庫中第一個和最後一個對象。

irb(main):055:0* Subject.first
=> #<Subject id: 1, created_at: "2012-10-20 06:14:56", updated_at: "2012-10-20 06:14:56", name: "First Subject", position: nil>
irb(main):056:0> Subject.last
=> #<Subject id: 2, created_at: "2012-10-20 06:25:27", updated_at: "2012-10-20 06:25:27", name: "First Subject", position: nil>

另外一種查詢對象的方法是類似於Subject.find_by_name("First Subject")的形式,稱之爲動態查詢。其中by後面是某一個進行查詢的屬性的名字,比如Subject的name屬性。參數是屬性的值,比如“First Subject”。如此調用將會返回name屬性值爲“First Subject”的Subject對象。

irb(main):034:0* Subject.find_by_name("First Subject")
=> #<Subject id: 1, created_at: "2012-10-20 06:14:56", updated_at: "2012-10-20 06:14:56", name: "First Subject", position: nil>

通過find_by_id方法和find方法一樣,都是通過id進行查詢。

如果通過動態查詢沒有查找到符合條件的對象,與find方法拋出異常不同,find_by_xx方法只會返回nil表示記錄沒有找到。

irb(main):039:0* Subject.find_by_name("Second Subject")
=> nil

使用find_by_xx方法只會返回第一個符合條件的對象,所以一般來說這個方法大多用於探測一下數據庫中有指定屬性等於特定值的對象。要想得到符合條件的所有對象,需要將find_by和all組合在一起,使用find_all_by_xx

irb(main):060:0* Subject.find_all_by_name("First Subject")
=> [#<Subject id: 1, created_at: "2012-10-20 06:14:56", updated_at: "2012-10-20 06:14:56", name: "First Subject", position: nil>, #<Subject id: 2, created_at: "2012-10-20 06:25:27", updated_at: "2012-
10-20 06:25:27", name: "First Subject", position: nil>]

很明顯,這些檢索條件都很簡單,很顯然不能夠滿足複雜場景的需要。對於複雜的查詢場景,需要組織更加豐富的查詢條件。

irb(main):024:0> Subject.find(:all,:conditions=>["name=?","First Subject"])
=> [#<Subject id: 1, created_at: "2012-10-20 06:14:56", updated_at: "2012-10-20 06:14:56", name: "First Subject", positi
on: nil>, #<Subject id: 2, created_at: "2012-10-20 06:25:27", updated_at: "2012-10-20 06:25:27", name: "First Subject",
position: nil>]

請注意find系列的方法都是實時加載的,也就是說調用方法的同時就會與數據庫交互進行查詢。後面會講到可以使用懶加載的方法。

find方法雖然能夠進行條件過濾,但是返回的結果是一個列表,失去了再進一步過濾的能力。在Rails3.2以後就應該都轉向使用where方法進行條件過濾查詢了。

歡迎來我的博客http://blog.csdn.net/abbuggy/article/details/8092928

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