`
oldsong
  • 浏览: 4345 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

ActiveRecord中Find与Where区别

阅读更多
今天就遇到一个问题,用Find可以,但用Where会报错,情形是这样的:
class People < ActiveRecord::Base
  attr_accessor :level	#为model添加一个自定义变量 	
  def level 		
    weight%100 	
  end 
end 


如果调用代码是这样的

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


执行不会报错。

p = People.where(:sex == 'boy')
p.level


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

undefined method `level' for #


找不到level方法,但用find查找时却没有问题,这才意识到find与where查找是有区别的。
后来去<a href="http://guides.rubyonrails.org/active_record_querying.html" target="_blank">rails guide</a>找了些资料,总结如下:
从数据库中查找对象有以下方法。

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

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

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

看后恍然大悟,Find比其它查询会多出3和4两步操作,这就是问题所在。
以后要尽量少用where等与原生SQL紧密的查询,多用Find。
欢迎访问个人小博:
http://rubyer.me/blog/470
分享到:
评论

相关推荐

    ActiveRecord简单实例_activerecord.zip

    在Ruby on Rails框架中,ActiveRecord是一个至关重要的组件,它负责模型(Model)与数据库之间的交互。本实例将深入探讨ActiveRecord的基本用法,帮助理解如何在实际开发中有效地运用这个强大的工具。 首先,让我们...

    lazy_find:简化了ActiveRecord中的first,last,take方法

    Simplified the first,last,take methods in ActiveRecord.So instead of using where and first, you can directly use first. 安装 将此行添加到您的应用程序的Gemfile中: gem 'lazy_find' 然后执行: $ ...

    wherex:使用 Regexp 作为 ActiveRecord 中任何查找器的值

    Wherex 是 ,这意味着我们将始终指示向后不兼容的更改与主要版本碰撞,因此您可以在Gemfile使用它: gem 'wherex' , '~&gt; 1.0' 仅适用于 Rails &gt;= 3.1 例子 # find users in 93, 94 and 95 (5 digit) zipcodes ...

    ActiveRecord简单实例代码.zip

    例如,`User.where(name: "John")`将返回所有名字为John的用户记录,而`User.find(1)`则会找到ID为1的用户。 5. **关联关系** ActiveRecord支持多种关联关系,如`has_many`、`belongs_to`、`has_one`和`has_and_...

    activerecord_where_assoc:使ActiveRecord在关联上执行条件

    使用此gem可以轻松地根据ActiveRecord(Rails)中记录的关联来进行条件。 (使用SQL的EXISTS运算符) # Find my_post's comments that were not made by an admin my_post . comments . where_assoc_not_exists ( ...

    Ruby-Spyke与REST服务交互用一种类似于ActiveRecord的管理器

    Spyke是一款由Brent O'Bannon开发的Ruby库,它的设计目标是提供一个与ActiveRecord类似的接口,用于处理REST服务的交互。这意味着你可以使用类似于ActiveRecord的方法来创建、读取、更新和删除远程资源,而无需直接...

    Rails3的ActiveRecord 查询API.doc

    在 Rails 2.x 中,许多使用哈希参数的查询方法如 `:conditions`, `:include`, `:joins` 等在 Rails 3.1 中被标记为过时,虽然在3.1版本中仍然可用,但计划在 Rails 3.2 中完全移除。这些变化主要是为了引入一个新的...

    simple_scope:允许您在 ActiveRecord 模型上定义魔术范围,而无需提供 where 条件

    允许您在 ActiveRecord 模型上定义魔法scope ,而无需提供where条件。 条件源自scope的名称。 多个条件可以通过名字被他们用分离来定义and很像魔术find_by_attribute1_and_attribute2方法。 安装 将此行添加到应用...

    Python-OratorORM提供了一个简单而优美的ActiveRecord实现

    Python中的Orator ORM是一个轻量级且易于使用的对象关系映射(ORM)库,它为开发者提供了在Python项目中操作数据库的便利性。这个库深受Laravel框架数据库组件的启发,但针对Python语言的特点进行了优化,使其更加...

    find_as_hashes:提供ActiveRecord方法以属性散列而不是实例化ActiveRecord对象的形式返回结果。 在处理大量结果以提高性能时非常有用

    活动记录添加方法以返回属性哈希,而不是实例化的ActiveRecord对象。 当使用大量记录时,这很有用,...例子&gt; User.where(:email =&gt; nil).all_as_hashes=&gt; [ {:id =&gt; 123, :name =&gt; "Joe User", :email =&gt; nil}, {:id =&gt;

    lean-activerecord

    此类将实现以下“ActiveRecord::Base”方法: '::all':返回数据库中所有记录的数组'::find': 按主键查找单条记录'#insert':在表中插入一个新行'#update':更新行'#save':一种方便的方法,可以适当地调用 'insert...

    在Ruby on Rails中优化ActiveRecord的方法

    ActiveRecord简化了数据库操作,允许开发者通过模型对象与数据库交互,这包括创建、读取、更新和删除数据。然而,随着应用规模的增长,性能优化变得至关重要。以下是一些在使用ActiveRecord时进行性能优化的关键点:...

    activerecord-with-arel:我们在 http 上的谈话的示例应用程序

    ActiveRecord提供了丰富的查询方法,如`find`,`where`,`create`等,使得数据库操作变得简单直观。 然而,当我们需要进行复杂的SQL查询时,Arel就发挥了关键作用。Arel是一个独立于ActiveRecord的库,它允许我们...

    W5D5:W5D5 Classwork-Rails ActiveRecord查询

    在Ruby on Rails框架中,ActiveRecord是核心组件之一,它负责数据库操作并与模型(Model)进行交互。在“W5D5: W5D5 Classwork - Rails ActiveRecord查询”这个主题中,我们将深入探讨如何使用ActiveRecord进行有效...

    redmine-find_by_sql

    在Redmine中,`find_by_sql`是一个非常实用的功能,它允许开发者通过自定义SQL查询来检索模型的数据,这是ActiveRecord框架的一个扩展。这个功能在处理复杂查询或需要结合数据库特定特性时尤其有用,因为标准的...

    ASP实现ActiveRecord数据查询更新 v1.0

    Dao.Where() 用法 与 Dao.Find() 用法: 注: Where用法 和 Find用法 基本差不多,都是条件筛选数据。 Find用法 更灵活, 可以用 Dao.Find("1,3,5") 来查询 自动编号(id) 为 1, 3, 5的数据 Dao.Find("1,3,5") 又...

    Rails 3中的Active Record的查询变化.doc

    在处理条件查询时,旧的`:conditions`参数变成了`where`,例如`Article.find(:all, :conditions =&gt; ["published_at , Time.now], :include =&gt; :comments)`在Rails 3中应写作`Article.where("published_at , Time.now...

    pdo_model:PDOModel - 使用 PDO(PHP 数据对象)的类似 DataModel 类的 ActiveRecord

    4. **查询过滤与排序**:可以使用 `where()` 方法添加查询条件,`order_by()` 方法进行排序,例如:`$users = User::find()-&gt;where('age &gt;', 18)-&gt;order_by('name', 'ASC')-&gt;get();` 5. **处理关联关系**:根据具体...

Global site tag (gtag.js) - Google Analytics