论坛首页 编程语言技术论坛

ActiveRecord中Find与Where区别

浏览 10405 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-08-31   最后修改:2011-09-03
今天就遇到一个问题,用Find可以,但用Where会报错,情形是这样的:
class Person < ActiveRecord::Base
  attr_accessor :level	#为model添加一个自定义变量 	
  def level 		
    weight%100 	
  end 
end 


如果调用代码是这样的

p = Person.find(:all, :conditions => "sex=boy")
p.level

执行不会报错。

p = Person.where(:sex => 'boy')
p.level

如果是上面的,执行会报错:

undefined method `level' for #

原因是找不到level方法,但用find查找时却没有问题,这才意识到find与where查找是有区别的。
后来去rails guide找了些资料,总结如下:
从数据库中查找对象有以下方法。

    where
    select
    group
    order
    limit
    offset
    joins
    includes
    lock
    readonly
    from
    having

上面这些方法和SQL中关键字都有对应,只是为了代替原生的SQL语句,完成后返回一个ActiveRecord::Relation实例。
Model.find(options)方法,会做下面操作:
引用

1、转换options到相应的sql语句
2、执行sql查询并获取数据库查询结果
3、把每条记录根据model实例化成对应的Ruby对象
4、如果有的话,执行after_find 回调方法


Find比其它while类查询会多出3和4两步操作。
而实例变量level的值是在第3步设置的,所以上面测试中Find得到的结果可以调用level方法,而where类则不会。
以后要尽量少用where等与原生SQL紧密的查询,多用Find。
欢迎访问个人小博
   发表时间:2011-08-31  
为什么不写成 People.all(:conditions => "sex=boy") 这样不是简洁很多
0 请登录后投票
   发表时间:2011-08-31  
p = People.where(:sex == 'boy')
p.level


这个是不是写错了,应该为
p = People.where(:sex => 'boy')
0 请登录后投票
   发表时间:2011-08-31  
xieren58 写道
p = People.where(:sex == 'boy')
p.level


这个是不是写错了,应该为
p = People.where(:sex => 'boy')

已经改正,谢谢
0 请登录后投票
   发表时间:2011-08-31  
我奇怪的是两种方法的返回结果都不是单个对象,为何楼主的第一个返回结果可以调用实例方法?
0 请登录后投票
   发表时间:2011-09-02  
奇怪,按照rails的惯例,Model不是应该要单数的吗?怎么来了个People!
  • 大小: 3.4 KB
0 请登录后投票
   发表时间:2011-09-03  
引用
看后恍然大悟,Find比其它查询会多出3和4两步操作,这就是问题所在。
以后要尽量少用where等与原生SQL紧密的查询,多用Find。

恍然大悟之后居然得出这么一个结论
0 请登录后投票
   发表时间:2011-09-03  
楼主你好逗
0 请登录后投票
   发表时间:2011-09-03   最后修改:2011-09-03
不好意思,第一次鼓起勇气贴代码,丑媳妇也要见公婆。
哪里丑,大家尽管提指出来
0 请登录后投票
   发表时间:2011-09-04  
这么多高手都不好意思说,我来说两句
Person.find(:all, :conditions => "sex=boy") 和 Person.where(:sex => 'boy') 的返回值是什么类型的?对,是Array,一个Array实例哪里来的level方法?
奇怪的是,find为啥不报错?这是本帖的重点问题
rails3引入的where等查询语句比conditions这种可读性强很多,强烈推荐使用
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics