目录#
约定#
命名约定#
Rails 把模型的类名转换成复数,然后查找对应的数据表。例如,模型类名为 Book,数据表就是 books。如果类名由多个单词组成,应该按照 Ruby 的约定,使用驼峰式命名法,这时对应的数据库表将使用下划线分隔各单词。因此:
- 数据库表名:复数,下划线分隔单词(例如 book_clubs)
- 模型类名:单数,每个单词的首字母大写(例如 BookClub)
模型/类 | 表/模式 |
---|---|
Article | articles |
LineItem | line_items |
Deer | deers |
Mouse | mice |
Person | people |
数据库里的模型约定#
根据字段的作用不同,Active Record 对数据库表中的字段命名也做了相应的约定:
外键:使用 singularized_table_name_id
形式命名,例如 item_id
,order_id
。创建模型关联后,Active Record 会查找这个字段;
主键:默认情况下,Active Record 使用整数字段 id 作为表的主键。使用 Active Record 迁移创建数据库表时,会自动创建这个字段;
还有一些可选的字段,能为 Active Record 实例添加更多的功能:
created_at
:创建记录时,自动设为当前的日期和时间;updated_at
:更新记录时,自动设为当前的日期和时间;lock_version
:在模型中添加乐观锁;type
:让模型使用单表继承;(association_name)_type
:存储多态关联的类型;(table_name)_count
:缓存所关联对象的数量。比如说,一个 Article 有多个 Comment,那么 comments_count 列存储各篇文章现有的评论数量;
CRUD#
创建#
new
和create
方法都能创建新对象,区别在于,new
产生的对象需要save方法
才能存入数据库,而creat方法
即时创建
读取#
以User
为例;
User.all
返回所有的集合User.first
返回第一条User.find_by(name: 'David')
返回第一个name是David的条目User.where(name: 'David', occupation: 'Code Artist').order(created_at: :desc)
查找所有名为 David,职业为 Code Artists 的用户,而且按照 created_at 反向排列(:desc)
更新#
1 | //普通修改 |
1 | //散列式简写 |
1 | //一次更新多个属性时 |
删除#
1 | user = User.find_by(name: 'David') |
数据验证#
save!
和 update!
,被称为爆炸方法,如果验证失败,抛出 ActiveRecord::RecordInvalid
异常