文章目录
  1. 1. 目标
  2. 2. 步骤
    1. 2.1. Step 0:建立新分支
    2. 2.2. Step 4: 给products增加更多的属性
  3. 3. Step 9:将变更 commit 进去 git 里面。
  4. 4. 本章详解

大家好,本系列文章主要是对我参加全栈营JDstore魔改大赛作品「季风 & MONSOON」的复盘。由于本人也是新手,文章中一定有很多幼稚的错误或代码,希望大家帮忙指出,可反馈至我的邮箱kerzzi@outlook.com,我会持续完善本系列。非常感谢。
本系列是在全栈营JDstore教程基础之上进行魔改,本系列第1-11章节为全栈营JDstore教程,请在完成全栈营JDstore教程的基础上进行测试。

目标

实作商品多级分类功能(1)

步骤

Step 0:建立新分支

在终端执行

checkout -b story09```。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
### Step 2:
在终端执行```rails g model category```。
### Step 3:
打开新建的db/migrate/20170609135005_create_categories.rb,修改成如下内容
```ruby db/migrate/20170609135005_create_categories.rb
class CreateCategories < ActiveRecord::Migration[5.0]
def change
create_table :categories do |t|
t.string :title
t.integer :weight, default: 0 #用于权重的字段,方面后续按不同顺序展示商品
t.integer :products_counter, default: 0 #该分类下的产品数量字段
t.timestamps
end
add_index :categories, [:title]
#养成习惯建立一张表时,最好将索引建立好,比如搜索功能会用到
end
end

Step 4: 给products增加更多的属性

在终端执行

g migration add_more_details_to_product```。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
打开db/migrate/20170609135208_add_more_details_to_product.rb,修改为如下内容
```ruby db/migrate/20170609135208_add_more_details_to_product.rb
class AddMoreDetailsToProduct < ActiveRecord::Migration[5.0]
def change
add_column :products, :category_id, :integer
add_column :products, :status, :string, default: 'off'
#指示商品状态,如上架、下架,设置为string模式方便后续增加状态数量,而且更为直观
add_column :products, :uuid, :string
#uuid是商品的序列号,教材中的不够直观,这样也方便后期增加功能
add_column :products, :msrp, :decimal, precision: 10, scale: 2
#msrp是市场建议零售价的缩写,用于打折等
#养成习惯,建立一张表时,最好将索引建立好,主要用于搜索
add_index :products, [:status, :category_id]
add_index :products, [:category_id]
add_index :products, [:uuid], unique: true #在数据库层面限制序列号的唯一性
add_index :products, [:title]
end
end

在终端执行

db:migrate```。
1
2
将变更 commit 进去 git 里面

git add .
git commit -m “建立分类model,并补充商品的属性”

1
2
3
4
5
6
7
### Step 5:安装树形结构管理的gem,用于管理商品分类
打开Gemfile
```ruby Gemfile
gem 'figaro'
gem 'rails-erd'
+ gem 'ancestry'

在终端执行

install```。
1
2
将变更 commit 进去 git 里面。

git add .
git commit -m “安装树形结构管理gem,用于管理商品分类”

1
2
3
4
5
6
7
8
9
10
11
12
13
### Step 6:
在终端执行```rails g migration add_ancestry_to_category```。
打开db/migrate/20170609135811_add_ancestry_to_category.rb,修改成如下内容
```ruby db/migrate/20170609135811_add_ancestry_to_category.rb
class AddAncestryToCategory < ActiveRecord::Migration[5.0]
def change
add_column :categories, :ancestry, :string
add_index :categories, [:ancestry]
end
end

别忘啦在终端执行,

db:migrate```。
1
2
3
4
5
6
7
8
### Step 7:
打开app/models/category.rb
```ruby app/models/category.rb
class Category < ApplicationRecord
+ has_ancestry
+ has_many :products, dependent: :destroy
end

打开app/models/product.rb

app/models/product.rb
1
2
3
4
5
class Product < ApplicationRecord
mount_uploader :image, ImageUploader
+ belongs_to :category
end

可以执行

erd```,查看目前model直接的关系
1
2
3
4
![](https://ww4.sinaimg.cn/large/006tKfTcgy1fgfaspw67oj31ce1amtaz.jpg)
将变更 commit 进去 git 里面。

git add .
git commit -m “给分类添加ancestry,并建立category和product之间的联系”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
### Step 8:建立生成随机数的model,备用
打开app/models/product.rb,商品创建前生成随机uuid。
```ruby app/models/product.rb
class Product < ApplicationRecord
mount_uploader :image, ImageUploader
belongs_to :category
+ before_create :set_default_attrs #产品创建之前生成唯一uuid
+ private
+ def set_default_attrs
+ self.uuid = RandomCode.generate_product_uuid
+ end
end

建立生成随机数的model:

在终端执行

app/models/random_code.rb```。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
打开touch app/models/random_code.rb
```ruby touch app/models/random_code.rb
module RandomCode
class << self
#这个model主要用于产生各种随机数,其他几个后续备用
#按规则,产生随机密码字符串
def generate_password len = 8
seed = (0..9).to_a + ('a'..'z').to_a + ('A'..'Z').to_a + ['!', '@', '#', '$', '%', '.', '*'] * 4
token = ""
len.times { |t| token << seed.sample.to_s }
token
end
def generate_cellphone_token len = 6
a = lambda { (0..9).to_a.sample }
token = ""
len.times { |t| token << a.call.to_s }
token
end
def generate_utoken len = 8
a = lambda { rand(36).to_s(36) }
token = ""
len.times { |t| token << a.call.to_s }
token
end
#按规则,产生随机产品序列号,前四位为月日
def generate_product_uuid
Date.today.to_s.split('-')[1..-1].join() << generate_utoken(6).upcase
end
#按规则,产生随机订单号,前四位为月日
def generate_order_uuid
Date.today.to_s.split('-').join()[2..-1] << generate_utoken(5).upcase
end
end
end

Step 9:将变更 commit 进去 git 里面。

1
2
3
4
5
6
git add .
git commit -m "商品创建前生成随机uuid"
git push origin story09
git checkout master
git merge story09
git push origin master

本章详解

努力更新中,上班族请理解。。。。。

文章目录
  1. 1. 目标
  2. 2. 步骤
    1. 2.1. Step 0:建立新分支
    2. 2.2. Step 4: 给products增加更多的属性
  3. 3. Step 9:将变更 commit 进去 git 里面。
  4. 4. 本章详解