据说很多人使用 Rails 就是因为喜欢 ActiveRecord,由于我只是一个菜鸟也没有怎么使用过别的框架,所以并不能很深刻地体会到不同。不过在学习 ActiveRecord 之前我也简单学了 SQL 语法还有纯手工写过 Ruby OOP 的程序,所以开始用 ActiveRecord 之后发现的确是方便很多,不过大部分都是语法糖,用约定把一些复杂的中间环节给封装起来了。所以如果不去了解SQL和Ruby,马上进入Rails Model 和 ActiveRecord 估计会一脸蒙逼。
在开始学习Rails model 和 Active record后,我发现里面有大量的约定,如果没有仔细地去区分和记忆,很容易看不懂和混淆起来,因此希望把这个阶段学到得东西总结一下。
让我们进入正题,新建一个Rails项目
rails new another-app
第一种情况
从0到1建立一个Model,我们需要如何操作
rails generate model Restaurant name:string stars:integer
# 建立了一个 Restaurant model,并且创建了两个column,分别是 string 和 integer
Rails自动生成以下代码
这个Migration文件是在新建 model 时rails自动建立的。
如果后面如果要继续对model进行修改,必须手动运行migrate命令,生成新的migration框架文件,并且编辑里面的代码,这一点要注意,不然容易弄不清楚。
# db/migrate/YYYYMMDDHHMMSS_create_restaurants.rb
class CreateRestaurants < ActiveRecord::Migration[5.1]
def change
create_table :restaurants do |t|
t.string :name
t.integer :stars
t.timestamps
end
end
end
# app/models/restaurant.rb
class Restaurant < ApplicationRecord
end
然后运行 rails db:migrate
生成 db/schema.rb
文件,对model的操作流程就算告一段落了。
第二种情况
修改一个 model 的信息。比如为 Restaurant 这个 model 增加一个 “address” colmn我们需要怎么操作呢?
这一次和新建model后的操作有点不同,我们要先建立一个migration
rails g migration AddAddressToRestaurants
# invoke active_record create
# db/migrate/YYYYMMDDHHMMSS_add_address_to_restaurants.rb
这时新建的migration文件 YYYYMMDDHHMMSS_add_address_to_restaurants.rb
默认是空的,需要对内容进行编辑,里面的 change 方法就是我们需要写上去的。
class AddAddressToRestaurants < ActiveRecord::Migration[5.1]
def change
add_column :restaurants, :address, :string
end
end
然后运行 rails db:migrate
更新Schema文件,修改model的流程就结束了。
change 这个方法除了add_column以为还有别的,以下是常用的几个:
change
- add_column
- change_column
- rename_column
- remove_column
- add_reference ( For 1 : n )
产看更多和 Migration 相关的文档信息:
Active Record Migrations - Ruby on Rails Guides
总结一下流程:
1.新建Model
运行新建model命令( 新建model ) ⇒ 自动生成migrate文件 ⇒ 运行db:migrate ⇒ 生成新的schema文件
2.已有Model,进行修改
运行migration命令 ( 编辑model ) ⇒ 自动生成migrate文件 ⇒ 补充migrate文件内容 ⇒ 运行db:migrate ⇒ 更新schema文件