Rails幼幼班--由seeds认识Rake

什麽时候知道自己已经是大叔了...从看到国民妹妹会露出姨母笑时...


或许这部分比较简单,网路上查不到太多中文资料,自己纪录笔记一下。

seeds在哪里?

专案中:project_name/db/seeds.rb
与Migrate这些资料放在一起,之前有简单操作过Migration,主要是在建立资料部分,当然seeds也与此相关。

当我们於专案中,用Rails console来操作建立新资料。(练习请用Rails console --sandbox)

#Model_name.new
2.7.3 :001 > Player.new
 => #<Player id: nil, name: nil, power: nil, country: nil, created_at: nil, updated_at: nil, level: 2> 
#可以发现,除了level我有给预设的value外,其余值都是nil,代表只是给了一个"壳"。

Create与Save差异在於有没有自动接save,new没有。

#Model_name.create
2.7.3 :002 > Player.create
#略过一段程序码。
 => #<Player id: 21, name: nil, power: nil, country: nil, created_at: "2021-08-20 06:17:11.601626000 +0000", updated_at: "2021-08-20 06:17:11.601626000 +0000", level: 2> 
#框架中,action: create未做处理前,直接会执行action: save。

一样可以发现除了Rails中预设会给资料的id与timestamps外,其余资料还是nil。

假设我想有内容物的资料怎麽办?

当然是给参数。

2.7.3 :007 > Player.create(name: "大叔", power: 10, country: "台北", level: 3)
  #略
  TRANSACTION (0.1ms)  RELEASE SAVEPOINT active_record_1
 => #<Player id: 25, name: "大叔", power: 10, country: "台北", created_at: "2021-08-20 06:31:34.412628000 +0000", updated_at: "2021-08-20 06:31:34.412628000 +0000", level: 3> 
 #预设值一样可以手动给,预设值比较像,先设定好一个值,如果我们没给会给那个值

假设我想一次建立10笔怎麽办?

那就输入10次..
会这麽勤劳有鬼...

2.7.3 :008 > 10.times do Player.create end
#中间跑一大段英文,有10段重复的...略
=> 10 #还贴心回传个10,代表跑完了

那假设我有三个model,都想建立10笔资料怎麽办

$ 10.times do Model_name.create end
$ 10.times do Model_name.create end
$ 10.times do Model_name.create end

好的,不可能这麽麻烦。

seeds

内建Rake指令之一(预设无内容),用於後台快速建立资料。

#project_name/db/seeds.rb

10.times do
  Player.create(name: "大叔", power: 2, country: "台北")
end

puts "跑完了"  #可加可不加,习惯有提示所以加。

於rails console,执行

$ rails db:seed 

正常会跑出"跑完了",再去资料库查看,或以指令查,可以发现建立好10笔大叔资料了。
所以当要建立测试资料,也不可能去view真的操作10次,以seeds来处理。

补充Ruby on Rails Guides

5.times do |i|
  Product.create(name: "Product ##{i}", description: "A product.")
end
# 透过语法当然可以创建内容较不同的资料。

创建内容不同的假资料:Faker

gem。
安装後我们先於irb操作。

$ require 'faker'  #gem为第三方函式库,使用前须require。
=> true    #跳false当然代表失败,先确认有无正确安装吧。

$ Faker::Game.title
=> "Bayonetta"  

$ Faker::Games::Heroes.name
 => "Moandor" 

Bayonetta...刚好是喜欢的游戏,传教一下...

先不论看不看得懂指令原理,可以知道经过Faker这个gem,可以创建许多"资料"。
当然有些资料很明显是内建打包好的。

於rails console操作,如有正确安装於gemfile并bundle,gem会属於专案本身一部分,不需要require。

$ Player.create(name: Faker::Name.name)
=> #<Player id: 43, name: "Lacy Farrell", power: nil, country: nil, created_at: "2021-08-20 07:42:40.736607000 +0000", updated_at: "2021-08-20 07:42:40.736607000 +0000", level: 2> 

$ Player.create(name: Faker::Name.name, power: rand(4..10), country: Faker::Address.
country)
=> #<Player id: 45, name: "Cleo Abbott", 
                    power: 6, 
                    country: "Kyrgyz Republic", 
                    created_at: "2021-08-20 07:46:33.362240000 +0000", 
                    updated_at: "2021-08-20 07:46:33.362240000 +0000", 
                    level: 2> 

所以将指令搬到seeds.rb。
当指令多时,以後只需要一个指令完成。

10.times do
  Player.create(
    name: Faker::Name.name,
    power: rand(4..10),
    country: Faker::Address.country)
end

puts "跑完了"

如果想建立其他语系资料,需先改Faker的locales,seeds.rb直接加入下面这段即可。

Faker::Config.locale = "zh-TW"

10.times do
  Player.create(
    name: Faker::Name.nam
    略....

Faker支援语系https://github.com/faker-ruby/faker/tree/master/lib/locales
繁体中文支援哪些资料(不支援的一样只会给英文)。
https://github.com/faker-ruby/faker/blob/master/lib/locales/zh-TW.yml


Rake

上面其实已经讲解完怎麽操作,及内容怎麽写。(用Ruby写...)
不过seeds.rb其实是透过 rails db:seed 这指令来执行其内容,实际编写还是有不同的地方。

维基百科:

Rake是一款软件任务管理及组建自动化工具。用户可指定任务、描述依赖关系及分组命名空间中的任务。
Rake使用Ruby编写,使用以Ruby语法编写的Rakefile。
Rake使用Ruby的匿名函数块来定义多个任务并允许用户使用Ruby语法。

Rake其实就是"脚本"或"任务"。

请於专案下执行

$ rails -T    #rake -T 也可。

出现的那一堆就是已经内建好的rake,应该说建立好的"task"

补充:不加 -T,rake指令不会有描述档,还会出现generate, console等指令。
-T,代表叫出有描述档的。(description)

建立自己的task

project_name/lib/tasks 这个资料夹,为存放处。
副档案名以".rake"命名。

# project_name/lib/tasks/rake_demo01.rake
task :rake_name_free do
  puts "偷懒就用Hello world"
end

存挡後执行

$ rails rake_name_free
=> 偷懒就用Hello world

为了方便加入description

没加入description前,rails -T里面是不会出现自己建立的task的。
加入方式。

# project_name/lib/tasks/rake_demo01.rake
desc "人生第一只rake..."   #就这麽简单
task :rake_name_free do  
  puts "偷懒就用Hello world"
end
$ rails -T

https://ithelp.ithome.com.tw/upload/images/20210820/20135887Kw8Jjzw7nw.png

如果连description都不够用? namespace!

其实是,可能在方法命名上,内容即使不同,但命名的灵感已经不够时,可以用namespace这个方法处理。
首先建立两个档案

# project_name/lib/tasks/rake_demo01.rake
desc "人生第一只rake..."
task :rake_test do
  puts "偷懒就用Hello world"
end
# project_name/lib/tasks/rake_demo01.rake
desc "人生第二只rake..."
task :rake_test do
  puts "继续偷懒就继续用Hello world"
end

执行

$ rails -T

会发现只有一个rake,两个描述。
https://ithelp.ithome.com.tw/upload/images/20210820/201358873zHJrMzp1X.png

执行会发现

$ rails rake_name_free 
偷懒就用Hello world
继续偷懒就继续用Hello world

两个都会跑,如果是想这样一次跑两个rake....
可以,但通常不这样做,等等提。

先以namespace处理。

namespace :this_is_two do
  desc "人生第二只rake..."
  task :rake_name_free do
    puts "继续偷懒就继续用Hello world"
  end
end

存挡执行rails -T,会发现。
https://ithelp.ithome.com.tw/upload/images/20210820/20135887LLFj8BRnAt.png

$ rails this_is_two:rake_name_free
继续偷懒就继续用Hello world

一个rake执行复数rake

档案内容先做修改

#first.rake
desc "人生第一只rake..."
task :rake_name_free do
puts "偷懒就用Hello world"
end

#second.rake
desc "人生第二只rake..."
task :rake_two do
puts "继续偷懒就继续用Hello world"
end

方法一,用第三个rake执行这两个。

在建立一个新档案。

# 我不会数三.rb
desc "G胖不会数3"
task :rake_three => ["rake_name_free","rake_two"]
$ rails rake_three               
偷懒就用Hello world
继续偷懒就继续用Hello world

方法二,execute

将first.rake修改

task :rake_name_free do
  puts "偷懒就用Hello world"
  Rake::Task["rake_two"].execute
end

#执行
$ rails rake_name_free  
偷懒就用Hello world
继续偷懒就继续用Hello world

衍生:Rake Task中Invoke, Execute, Enhance差异
超过幼幼班等级,不想介绍...

最後

Rake tasks都预设是在development环境下操作,当然可以把指令改在其他环境操作。
不过目前部署网站都支援,可以设定指定task,所以查找各部署网站教学比较适合。


逻辑笑话?:
我以为切洋葱时闭眼睛就不会流眼泪了,但是我手流血了~


<<:  Video播放器 PyQt5 QMediaPlayer

>>:  Ruby幼幼班--Two Sum II

Day 13 - Kotlin的集合(2)

Day 11 - Kotlin的函式(2) 昨天我们讲了list集合,以及如何取得数值,今天我们要继...

Day 3 [Python ML] 选择建模用的资料(DecisionTree)

前言 一开始先接续昨天读取资料的部分,先使用pd.read_csv来读取资料 再利用DataFram...

Day_10 有线网路应用(三)

在有线网路应用(二)的应用中,使用树莓派当成主路由,乙太网路线为WAN,WIFI为LAN的布局。不过...

笔记-Color in Image and Video

Basics of Color Light and Spectra(光和光谱) 可见光(visibl...

Day 18. 阿咧?我记得我安装过XCode? Can't find Xcode install for Metal compiler | Unreal Engine

当我在Unreal Engine 4.27.0下载好试图启动软件时,跳出了下面这个视窗,     U...