Rails Model 的一些基本操作

据说很多人使用 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文件