今天就遇到一个问题,用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
分享到:
相关推荐
在Ruby on Rails框架中,ActiveRecord是一个至关重要的组件,它负责模型(Model)与数据库之间的交互。本实例将深入探讨ActiveRecord的基本用法,帮助理解如何在实际开发中有效地运用这个强大的工具。 首先,让我们...
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 是 ,这意味着我们将始终指示向后不兼容的更改与主要版本碰撞,因此您可以在Gemfile使用它: gem 'wherex' , '~> 1.0' 仅适用于 Rails >= 3.1 例子 # find users in 93, 94 and 95 (5 digit) zipcodes ...
例如,`User.where(name: "John")`将返回所有名字为John的用户记录,而`User.find(1)`则会找到ID为1的用户。 5. **关联关系** ActiveRecord支持多种关联关系,如`has_many`、`belongs_to`、`has_one`和`has_and_...
使用此gem可以轻松地根据ActiveRecord(Rails)中记录的关联来进行条件。 (使用SQL的EXISTS运算符) # Find my_post's comments that were not made by an admin my_post . comments . where_assoc_not_exists ( ...
Spyke是一款由Brent O'Bannon开发的Ruby库,它的设计目标是提供一个与ActiveRecord类似的接口,用于处理REST服务的交互。这意味着你可以使用类似于ActiveRecord的方法来创建、读取、更新和删除远程资源,而无需直接...
在 Rails 2.x 中,许多使用哈希参数的查询方法如 `:conditions`, `:include`, `:joins` 等在 Rails 3.1 中被标记为过时,虽然在3.1版本中仍然可用,但计划在 Rails 3.2 中完全移除。这些变化主要是为了引入一个新的...
允许您在 ActiveRecord 模型上定义魔法scope ,而无需提供where条件。 条件源自scope的名称。 多个条件可以通过名字被他们用分离来定义and很像魔术find_by_attribute1_and_attribute2方法。 安装 将此行添加到应用...
Python中的Orator ORM是一个轻量级且易于使用的对象关系映射(ORM)库,它为开发者提供了在Python项目中操作数据库的便利性。这个库深受Laravel框架数据库组件的启发,但针对Python语言的特点进行了优化,使其更加...
活动记录添加方法以返回属性哈希,而不是实例化的ActiveRecord对象。 当使用大量记录时,这很有用,...例子> User.where(:email => nil).all_as_hashes=> [ {:id => 123, :name => "Joe User", :email => nil}, {:id =>
此类将实现以下“ActiveRecord::Base”方法: '::all':返回数据库中所有记录的数组'::find': 按主键查找单条记录'#insert':在表中插入一个新行'#update':更新行'#save':一种方便的方法,可以适当地调用 'insert...
ActiveRecord简化了数据库操作,允许开发者通过模型对象与数据库交互,这包括创建、读取、更新和删除数据。然而,随着应用规模的增长,性能优化变得至关重要。以下是一些在使用ActiveRecord时进行性能优化的关键点:...
ActiveRecord提供了丰富的查询方法,如`find`,`where`,`create`等,使得数据库操作变得简单直观。 然而,当我们需要进行复杂的SQL查询时,Arel就发挥了关键作用。Arel是一个独立于ActiveRecord的库,它允许我们...
在Ruby on Rails框架中,ActiveRecord是核心组件之一,它负责数据库操作并与模型(Model)进行交互。在“W5D5: W5D5 Classwork - Rails ActiveRecord查询”这个主题中,我们将深入探讨如何使用ActiveRecord进行有效...
在Redmine中,`find_by_sql`是一个非常实用的功能,它允许开发者通过自定义SQL查询来检索模型的数据,这是ActiveRecord框架的一个扩展。这个功能在处理复杂查询或需要结合数据库特定特性时尤其有用,因为标准的...
Dao.Where() 用法 与 Dao.Find() 用法: 注: Where用法 和 Find用法 基本差不多,都是条件筛选数据。 Find用法 更灵活, 可以用 Dao.Find("1,3,5") 来查询 自动编号(id) 为 1, 3, 5的数据 Dao.Find("1,3,5") 又...
在处理条件查询时,旧的`:conditions`参数变成了`where`,例如`Article.find(:all, :conditions => ["published_at , Time.now], :include => :comments)`在Rails 3中应写作`Article.where("published_at , Time.now...
4. **查询过滤与排序**:可以使用 `where()` 方法添加查询条件,`order_by()` 方法进行排序,例如:`$users = User::find()->where('age >', 18)->order_by('name', 'ASC')->get();` 5. **处理关联关系**:根据具体...