精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-31
最后修改:2011-09-03
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。 欢迎访问个人小博 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-08-31
为什么不写成 People.all(:conditions => "sex=boy") 这样不是简洁很多
|
|
返回顶楼 | |
发表时间:2011-08-31
p = People.where(:sex == 'boy') p.level 这个是不是写错了,应该为 p = People.where(:sex => 'boy') |
|
返回顶楼 | |
发表时间:2011-08-31
xieren58 写道 p = People.where(:sex == 'boy') p.level 这个是不是写错了,应该为 p = People.where(:sex => 'boy') 已经改正,谢谢 |
|
返回顶楼 | |
发表时间:2011-08-31
我奇怪的是两种方法的返回结果都不是单个对象,为何楼主的第一个返回结果可以调用实例方法?
|
|
返回顶楼 | |
发表时间:2011-09-02
奇怪,按照rails的惯例,Model不是应该要单数的吗?怎么来了个People!
|
|
返回顶楼 | |
发表时间:2011-09-03
引用 看后恍然大悟,Find比其它查询会多出3和4两步操作,这就是问题所在。
以后要尽量少用where等与原生SQL紧密的查询,多用Find。 恍然大悟之后居然得出这么一个结论 |
|
返回顶楼 | |
发表时间:2011-09-03
楼主你好逗
|
|
返回顶楼 | |
发表时间:2011-09-03
最后修改:2011-09-03
不好意思,第一次鼓起勇气贴代码,丑媳妇也要见公婆。
哪里丑,大家尽管提指出来 |
|
返回顶楼 | |
发表时间:2011-09-04
这么多高手都不好意思说,我来说两句
Person.find(:all, :conditions => "sex=boy") 和 Person.where(:sex => 'boy') 的返回值是什么类型的?对,是Array,一个Array实例哪里来的level方法? 奇怪的是,find为啥不报错?这是本帖的重点问题 rails3引入的where等查询语句比conditions这种可读性强很多,强烈推荐使用 |
|
返回顶楼 | |