rails一周探 day1

目录#

约定#

命名约定#

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_idorder_id 。创建模型关联后,Active Record 会查找这个字段;
主键:默认情况下,Active Record 使用整数字段 id 作为表的主键。使用 Active Record 迁移创建数据库表时,会自动创建这个字段;

还有一些可选的字段,能为 Active Record 实例添加更多的功能:

  1. created_at:创建记录时,自动设为当前的日期和时间;
  2. updated_at:更新记录时,自动设为当前的日期和时间;
  3. lock_version:在模型中添加乐观锁;
  4. type:让模型使用单表继承;
  5. (association_name)_type:存储多态关联的类型;
  6. (table_name)_count:缓存所关联对象的数量。比如说,一个 Article 有多个 Comment,那么 comments_count 列存储各篇文章现有的评论数量;

CRUD#

创建#

newcreate方法都能创建新对象,区别在于,new产生的对象需要save方法才能存入数据库,而creat方法即时创建

读取#

User为例;

  1. User.all 返回所有的集合
  2. User.first 返回第一条
  3. User.find_by(name: 'David') 返回第一个name是David的条目
  4. User.where(name: 'David', occupation: 'Code Artist').order(created_at: :desc) 查找所有名为 David,职业为 Code Artists 的用户,而且按照 created_at 反向排列(:desc)

更新#

1
2
3
4
//普通修改
user = User.find_by(name: 'David')
user.name = 'Dave'
user.save
1
2
3
//散列式简写
user = User.find_by(name: 'David')
user.update(name: 'Dave')
1
2
3
//一次更新多个属性时

User.update_all "max_login_attempts = 3, must_change_password = 'true'"

删除#

1
2
user = User.find_by(name: 'David')
user.destroy

数据验证#

save!update!,被称为爆炸方法,如果验证失败,抛出 ActiveRecord::RecordInvalid 异常