Rails-ActiveRecord

中文地址
M: Actice Record负责创建和使用需要持久存入数据库的数据,对象关系映射(ORM)系统

一. 基础

  1. 模式约定
    外键:命名规则 e.g item_id
    主键:默认整数字段id为主键,使用ActiveRecord迁移数据库时自动创建字段
    其他可选字段:
  2. 创建模型->创建Product模型,对应于products表,表中字段映射到模型属性中

    1
    2
    3
    //继承ApplicationRecord
    class Product < ApplicationRecord
    end
  3. 命名覆盖
    覆盖表名:生成的默认表名为products
    (1)可在models中指定表名self.table_name = “my_products”
    (2)models中手动指定固件 fixtures :my_products
    覆盖表的主键:
    self.primary_key = “product_id”

  4. CRUD
    (1)C
    create创建并保存;new只创建不保存,调用save保存
    (2)R
    User.all User.first User.find_by User.where().order
    (3)D
    user.destroy

二.迁移:按照时间顺序管理数据库模型

  1. 使用Ruby DSL,同时更新db/schema.rb
    在迁移中完成Active Record无法完成的撤销:在迁移中使用reversible方法;在迁移文件中用up和down代替change
  2. 创建迁移
    (1)创建独立的迁移文件 bin/rails generate migration AddPartNumberToProducts
    根据时间戳来确定要运行的迁移和迁移运行的顺序
    (2)迁移文件名称
    AddXXXToYYY 或 RemoveXXXFromYYY会创建相应的change

    1
    2
    3
    4
    5
    6
    7
    8
    9
    //$ bin/rails generate migration AddPartNumberToProducts part_number:string 
    def change
    add_column :products, :part_number, :string
    end
    //$ bin/rails generate migration AddPartNumberToProducts part_number:string:index
    def change
    add_column :products, :part_number, :string
    add_index :products, :part_number
    end

    CreateXXX

    1
    2
    3
    4
    5
    6
    7
    // $ bin/rails generate migration CreateProducts name:string part_number:string
    def change
    create_table :products do |t|
    t.string :name
    t.string :part_number
    end
    end

    (3)创建联结数据表

    1
    2
    3
    4
    5
    6
    7
    $ bin/rails g migration CreateJoinTableCustomerProduct customer product
    def change
    create_join_table :customers, :products do |t|
    # t.index [:customer_id, :product_id]
    # t.index [:product_id, :customer_id]
    end
    end
  3. 模型生成器
    $ bin/rails generate model Product name:string description:text

  4. 编写迁移文件
    (1)主键
    默认情况下,create_table 方法会创建 id 主键。可以用 :primary_key
    选项来修改主键名称,还可以传入 id: false 选项以禁用主键。
    (2)创建联结数据表
    create_join_table :products, :categories, table_name: :categorization
    (3)修改数据表
    t.remove t.rename t.string t.index
    (4)修改字段 change_column无法撤销
    change_column :products, :part_number, :text
    //TO DO
  5. 运行迁移 bin/rails任务(默认为开发环境)
    (1)rails db:migrate VERSION=20080906120000
    调用所有未运行的迁移中的change或者up方法;自动执行db:schema:dump任务
    运行VERSION之前的迁移文件,VERSION为迁移文件名的数字前缀
    (2)bin/rails db:rollback (STEP=3):回滚最后一个(三个)迁移
    bin/rails db:migrate:redo STEP=3:重复执行最后三个迁移
    (3)rails db:setup 创建数据库
    (4)rails db:reset 删除并重新创建数据库
    (5)rails db:migrate:up 和 rails db:migrate:down VERSION=20080906120000
    (6)rails db:migrate RAILS_ENV=test 修改运行环境
    (7)rails db:drop:all 撤销所有migrate操作
  6. 修改现有迁移
    必须先回滚 bin/rails db:rollback,再执行rails db:migrate
    //To Do

三.数据验证

  1. 何时验证:保存时验证
    失败则不会存入:create,create!,save,save!,update,update!
  2. 存在验证
    validates :name
  3. 长度验证
    1
    2
    3
    4
    validates :name, length: { minimum: 2 }
    validates :bio, length: { maximum: 500 }
    validates :password, length: { in: 6..20 }
    validates :registration_number, length: { is: 6 }

定制信息::wrong_length、:too_long 和 :too_short 选项,%{count} 表示长度限制的值

1
2
validates :bio, length: { maximum: 1000,
too_long: "%{count} characters is the maximum allowed" }

  1. 检查空值
    1
    validates :name, :login, :email, presence: true