数据库操作与模型增强全解析
立即解锁
发布时间: 2025-08-20 01:20:59 阅读量: 1 订阅数: 3 


Rails 3入门:从零开始构建Web应用
### 数据库操作与模型增强全解析
#### 1. 数据库记录删除操作
在数据库操作中,我们常常需要删除记录,主要有两种方式:`destroy` 和 `delete`。
##### 1.1 使用 `destroy` 方法
`destroy` 是一个类方法,它会自动查找并删除记录。使用时可以直接在类上调用,无需先创建对象。它会在删除前实例化对象,并执行相关回调。
- 删除单条记录:
```ruby
>> Article.destroy(1)
=> [#<Article id: 1, title: "RailsConf", body: "RailsConf is the official gathering for Rails devel...", published_at: "2010-02-27 00:00:00", created_at: "2010-05-01 23:12:09", updated_at: "2010-05-01 23:12:09", excerpt: nil, location: nil>]
```
- 删除多条记录:可以传入一个主键数组,用方括号 `[]` 表示。
```ruby
>> Article.destroy([2,3])
=> [#<Article id: 2, ..>, #<Article id: 3, ..>]
```
`destroy` 方法的源码如下:
```ruby
def destroy(id)
if id.is_a?(Array)
id.map { |one_id| destroy(one_id) }
else
find(id).destroy
end
end
```
从源码可以看出,如果传入的参数是数组,`destroy` 会遍历数组,对每个元素调用自身方法,先查找(实例化对象)再调用实例版本的 `destroy` 方法。
##### 1.2 使用 `delete` 方法
`delete` 方法也是类方法,包括 `delete` 和 `delete_all`。与 `destroy` 不同的是,它不会实例化对象,也不执行回调,直接从数据库中删除记录。
- 删除单条记录:
```ruby
>> Article.delete(4)
=> 1
```
这里指定一个主键,操作返回删除的记录数,由于主键唯一,所以只删除一条记录。
- 删除多条记录:同样需要传入主键数组。
```ruby
>> Article.delete([5, 6])
=> 0
```
需要注意的是,与 `find` 方法不同,`delete` 必须显式传入数组对象,不能像 `Model.find(1,2,3)` 那样直接传入多个参数,而要使用 `Model.delete([1,2,3])`。
##### 1.3 按条件删除
使用 `delete_all` 类方法可以删除满足特定条件的所有记录。例如,删除特定日期之前的所有文章:
```ruby
>> Article.delete_all("published_at < '2011-01-01'")
>> 0
```
`delete_all` 的返回值是删除的记录数。要注意,如果不传入任何参数,`delete_all` 会删除表中的所有记录,使用时需谨慎。
#### 2. 模型验证与错误处理
在模型中,我们可以设置验证规则,防止保存无效记录到数据库。例如,在 `Article` 模型中,要求标题和正文不能为空:
```ruby
class Article < ActiveRecord::Base
validates :title, :presence => true
validates :body, :presence => true
end
```
每个 Active Record 对象都有一个 `errors` 属性,用于存储验证错误信息。下面是验证错误信息的获取和处理示例:
```ruby
>> article = Article.new
=> #<Article id: nil, title: nil, body: nil, published_at: nil, created_at: nil, updated_at: nil, excerpt: nil, location: nil>
>> article.errors.any?
=> false
```
此时虽然新创建的文章没有标题和正文,应该有错误,但由于还未触发验证,所以 `errors.any?` 返回 `false`。触发验证的最常见方式是尝试保存对象:
```ruby
>> article.save
=> false
```
保存失败,因为模型在保存前会进行验证,这里标题和正文为空,验证失败。再次检查错误信息:
```ruby
>> article.errors.any?
=> true
```
可以使用 `full_messages` 方法获取格式化的错误信息:
```ruby
>> article.errors.full_messages
=> ["Title can't be blank", "Body can't be blank"]
```
如果只关心某个特定属性的错误,可以使用 `on` 方法:
```ruby
>> article.errors.on(:title)
=> "can't be blank"
```
如果查询不存在或没有错误的属性,会返回 `nil`:
```ruby
>> article.errors.on(:
```
0
0
复制全文
相关推荐










