欢迎来我的博客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>
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>'
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>]
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>
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方法抛出异常不同,find_by_xx方法只会返回nil表示记录没有找到。
irb(main):039:0* Subject.find_by_name("Second Subject") => nil
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方法虽然能够进行条件过滤,但是返回的结果是一个列表,失去了再进一步过滤的能力。在Rails3.2以后就应该都转向使用where方法进行条件过滤查询了。
欢迎来我的博客http://blog.csdn.net/abbuggy/article/details/8092928