2014-02-16 69 views
2

我正在嘗試編寫一個非常簡單的Rails遷移工具,該工具會向表中添加一個新列,並使用其他列中的數據組合填充該列。但是,該列會被添加,但每個記錄的列值都是零。我究竟做錯了什麼?Rails遷移列已添加但尚未填充

class AddNameToPermissions < ActiveRecord::Migration 
    def change 
    add_column :auth_permissions, :name, :string 
    Auth::Permission.reset_column_information 
    Auth::Permission.all.each do |permission| 
     target_name = permission.target_symbol || permission.target_class 
     permission.name = permission.action << ", " << target_name 
     permission.save 
    end 
    end 
end 

回答

2

調用permission.save將執行包括驗證器在內的所有回調,也可能驗證器正在阻止記錄被保存。要跳過你可以使用update_column而不是保存

permission.update_column(:name, permission.action << ", " << target_name) 

也驗證我建議你一些提示:

  • 使用驗證:: Permission.find_each而不是驗證:: Permission.all.each (這會將所有記錄在存儲器中一次)
  • 嘗試更新rake任務的權限,並且只使用遷移修改表(它是推薦的好習慣方式)
+1

這是一個EXC好的答案,比我的好。 – Sean

+0

謝謝肖恩,我很感激。 –

+0

將其更改爲update_column也不起作用。我不得不寫一個自定義SQL查詢來做到這一點。仍然不確定爲什麼它沒有通過。 – radhika

0

除非您在遷移中使用默認選項,否則通常建議您在自定義rake任務中執行此操作。內容遷移有點反模式。你想要的主要邏輯是任何必須處理數據庫模式的東西。僅使用add_column行來運行遷移,然後編寫一個rake任務以將值從一個錶轉移到另一個表。

相關問題