濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 淺談Ruby on Rails下的rake與數(shù)據(jù)庫(kù)數(shù)據(jù)遷移操作

淺談Ruby on Rails下的rake與數(shù)據(jù)庫(kù)數(shù)據(jù)遷移操作

熱門標(biāo)簽:地圖標(biāo)注賺錢項(xiàng)目注冊(cè) 白銀外呼paas系統(tǒng) 百度地圖標(biāo)注自定義圖片 徐州網(wǎng)絡(luò)外呼系統(tǒng)哪個(gè)好 高德地圖標(biāo)注客服 湖州u友防封電銷卡 滴滴外呼系統(tǒng) 常德電銷平臺(tái)外呼系統(tǒng)軟件價(jià)格 電銷機(jī)器人廠商代理

不知道你有沒(méi)有把數(shù)據(jù)遷移寫入Migration文件的經(jīng)歷,相信無(wú)論是老鳥還是新手都這樣干過(guò)吧。事實(shí)上,這樣做并不是行不通,只不過(guò)這樣的實(shí)踐慢慢會(huì)給你引入一些不必要的麻煩。

一般認(rèn)為db/migrate文件夾里的內(nèi)容是關(guān)于你數(shù)據(jù)庫(kù)Schema的演變過(guò)程,每個(gè)新的開發(fā)或線上環(huán)境都要通過(guò)這些Migration來(lái)構(gòu)建可用的數(shù)據(jù)庫(kù)。但如果這里裝入了,負(fù)責(zé)細(xì)節(jié)的業(yè)務(wù)代碼,比如一些歷史遺留數(shù)據(jù)的遷移代碼之類的,當(dāng)一段時(shí)間后,數(shù)據(jù)庫(kù)的結(jié)構(gòu)變化了,但Migration沒(méi)有跟著變化,漸漸的曾經(jīng)的輔助代碼,就成了垃圾代碼,不僅不能幫忙構(gòu)建環(huán)境,還會(huì)讓rake db:migrate的執(zhí)行過(guò)程異常中斷,無(wú)形中增加了新環(huán)境的構(gòu)建成本。

所以正確的做法應(yīng)該是,Migration只負(fù)責(zé)Schema相關(guān)的事宜,而不該過(guò)問(wèn)數(shù)據(jù)的細(xì)節(jié),具體的數(shù)據(jù)細(xì)節(jié),全部交由rake任務(wù)來(lái)做,并且這些rake任務(wù)也不是一成不變的,隨著時(shí)間的推移它們也會(huì)廢棄掉,但因?yàn)樗鼈兣c系統(tǒng)的其它部分不想管,所以直接刪掉即可。不過(guò)使用Rake做數(shù)據(jù)遷移也是有講究的,具體如下:

Bad Rake Task

# lib/tasks/temporary/users.rake
namespace :users do
 task :set_newsletter => :environment do
  User.all.each do |user|
   if user.confirmed?
    user.receive_newsletter = true
    user.save
   end
  end
 end
end

任務(wù)會(huì)遍歷所有用戶,想想如果數(shù)據(jù)集很大會(huì)怎樣
通過(guò)ActiveRecord更新數(shù)據(jù),會(huì)觸發(fā)模型中的驗(yàn)證和創(chuàng)建回調(diào)方法
通過(guò)if條件語(yǔ)句來(lái)判斷是否需要更新數(shù)據(jù)
不能直觀的看出這個(gè)任務(wù)是干什么的,沒(méi)有一個(gè)desc,所以也無(wú)法通過(guò)rake -T找到它
Good Rake Task

# lib/tasks/temporary/users.rake
namespace :users do
 desc "Update confirmed users to receive newsletter"
 task set_newsletter: :environment do
  users = User.confirmed
  puts "Going to update #{users.count} users"

  ActiveRecord::Base.transaction do
   users.each do |user|
    user.mark_newsletter_received!
    print "."
   end
  end

  puts " All done now!"
 end
end

通過(guò)desc我們可以清楚的知道任務(wù)的意圖,并且它也會(huì)顯示在rake -T中
通過(guò)scope解決了if語(yǔ)句的問(wèn)題
引入了計(jì)數(shù)器,以及執(zhí)行狀態(tài)顯示,能讓我們了解到程序運(yùn)行時(shí)的情況
把數(shù)據(jù)的更改放到了事務(wù)中執(zhí)行,可以語(yǔ)法因?yàn)閿?shù)據(jù)異常,奔潰導(dǎo)致的不一致問(wèn)題
最后要補(bǔ)充說(shuō)明的一點(diǎn)是,有時(shí)候,可能直接用SQL語(yǔ)句更簡(jiǎn)單有效,特別是在數(shù)據(jù)集比較大的情況下,一條SQL能幫你省去不少無(wú)謂的循環(huán)!另外,記得上開發(fā)環(huán)境之前,最好預(yù)先檢測(cè)一下Rake任務(wù)的有效性。

您可能感興趣的文章:
  • Ruby連接使用windows下sql server數(shù)據(jù)庫(kù)代碼實(shí)例
  • 在Ruby程序中連接數(shù)據(jù)庫(kù)的詳細(xì)教程
  • Ruby中訪問(wèn)SQL Server數(shù)據(jù)庫(kù)的配置實(shí)例
  • ruby+nokogori抓取糗事百科前10頁(yè)并存儲(chǔ)進(jìn)數(shù)據(jù)庫(kù)示例
  • Ruby on Rails框架程序連接MongoDB的教程

標(biāo)簽:三沙 荊門 普洱 張家界 遼寧 梧州 公主嶺 永州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談Ruby on Rails下的rake與數(shù)據(jù)庫(kù)數(shù)據(jù)遷移操作》,本文關(guān)鍵詞  淺談,Ruby,Rails,下的,rake,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談Ruby on Rails下的rake與數(shù)據(jù)庫(kù)數(shù)據(jù)遷移操作》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于淺談Ruby on Rails下的rake與數(shù)據(jù)庫(kù)數(shù)據(jù)遷移操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    克拉玛依市| 双辽市| 永修县| 韶山市| 昌乐县| 密云县| 仪陇县| 安吉县| 武功县| 新兴县| 鹰潭市| 花莲市| 富裕县| 措勤县| 五原县| 宜阳县| 玛曲县| 广灵县| 平遥县| 鄂伦春自治旗| 凤翔县| 萨嘎县| 乐都县| 鄂托克前旗| 濮阳县| 辰溪县| 灵川县| 昭通市| 利川市| 岳阳市| 通辽市| 海丰县| 达拉特旗| 昌吉市| 南京市| 桃园市| 即墨市| 兴文县| 广河县| 平陆县| 北安市|