seeds.rb檔---用來餵db table裡相關的(或範例)資料。
在ruby on rails中,我們知道可以利用bin/rake db:migrate可以快速的就建立好資料表,但資料內容呢?
每次都要重新建立,好像太麻煩了點,而且我有個迷思:寧願把時間花在寫程式上,也不想要花在key資料上。於是查了一下有沒有可以方便export seeds.rb檔的方法,因為seeds.rb檔不會自動產生,要手動編輯資料才行…不~~~
在這邊就提供兩個網路上現成的方法,一個比較笨但是很容易上手,另一個相反,方便可相對的前置動作也較繁雜。
笨拙上手容易
參考文章:
http://www.xyzpub.com/en/ruby-on-rails/3.2/seed_rb.html
參考文章:
http://railsguides.net/how-to-generate-rake-task/
我們只要準備好一個rake檔就行了,內容怎麼改呢?
namespace :export do
desc "Prints xxxxs.all in a seeds.rb way."
task :xxxxs_seeds_format => :environment do
Xxxx.order(:id).all.each do |xxxx|
puts "Xxxx.create(#{event.serializable_hash.delete_if {|key, value| ['created_at','updated_at','id'].include?(key)}.to_s.gsub(/[{}]/,'')})"
end
end
end
xxxx的部份就是資料表的名稱,像是event,還有要看清楚複數及單數的地方及需要大寫的部份。
不只一個table欸,那就在新增desc的部份。
namespace :export do
desc "Prints xxxxs.all in a seeds.rb way."
task :xxxxs_seeds_format => :environment do
Xxxx.order(:id).all.each do |xxxx|
puts "Xxxx.create(#{event.serializable_hash.delete_if {|key, value| ['created_at','updated_at','id'].include?(key)}.to_s.gsub(/[{}]/,'')})"
end
end
desc "Prints yyys.all in a seeds.rb way."
task :yyys_seeds_format => :environment do
Yyy.order(:id).all.each do |event|
puts "Yyy.create(#{yyy.serializable_hash.delete_if {|key, value| ['created_at','updated_at','id'].include?(key)}.to_s.gsub(/[{}]/,'')})"
end
end
end
接著就是下指令
$ rake export:xxxxs_seeds_format
$ rake export:yyys_seeds_format
會印出xxxxs及yyys table的資料。
很簡單吧!只不過每個table都要獨立寫出來,然後一一下指令執行,萬一table數量很多,感覺好像太不便民了一些是吧!所以才會又找另一個方法!
方便複雜度高
參考文章:
https://github.com/kevTheDev/seed_dumper
這個方法要準備的檔案就比較多了,先把整個專案載下來,再一一放到我們的專案裡。基本上專案中沒有的檔案都能原封不動的複製過去,至於已經有的相關檔案,請copy來源檔的內容後,再貼到專案的同個檔案裡,不要直接覆蓋掉原本的檔案哦!就不在做詳細說明了,今天的我有點懶…
檔案都就緒後,就是下指令了
$ rake db:seed:dump
如果你也出現一堆WARN,嗯…我也是這樣,似乎是某個gem工具版本不符合,但檔案還是有正常輸出,既然不會造成問題就不跟他計較了。
可以檢查db folder裡新增了一個seed folder,只是輸出的檔案也跟我想的不大一樣,不是全部寫到seeds.rb,而是分別輸出各個table的rb檔,不過這樣也好,萬一我們只需要某個table的資料,就可以只針對想要的table做seed就好。
匯入資料庫
看來還是要把輸出得資料複製到seed.rb裡,目前研究的結果只能針對seed.rb檔做匯入,而且有個問題,如果table的欄位是使用date/datetime,匯出時是不包含雙引號的,但這樣匯入時會出錯,必需自行補上才行…oh my god!
匯入seed.rb檔指令的寫法
$ rake db:seed
怎麼分辨成功與否?沒有出現任何訊息就代表成功匯入資料了,如果下方出現一堆訊息就是有問題,訊息內會指出有錯誤的地方,修正後再重下指令就行了,希望大家匯入匯出都順利!