2012-01-12 55 views

回答

3

如果您已有數據,則無法在創建回調操作中執行此操作,因爲這些項目已經創建。然而,創建回調將幫助您爲新的對象,您將創建:

after_create :set_order_attribute 

def set_order_attribute 
    self.update_columns(order: id) if order.nil? 
end 

技術上可以更新遷移爲SQL語句現有的數據,但我不建議使用涉及的ActiveRecord模型的命令隨着模型的變化,遷移可能會隨時間斷開。要做到這一點在遷移,你將有一個在執行命令:最高法(不知道你想什麼行爲:下),像這樣:

def up 
    table_name = "foo" 
    execute "UPDATE #{table_name} SET order = id;" 
end 

另外,您可以創建一個單獨的rake任務做更新;這將使您的遷移更加清潔,並讓您更好地控制何時運行更新任務。

+1

有趣的是,直到我使用'after_create'之後,這對我才起作用。 – Fomentia 2015-09-16 11:51:45

+1

@Fomentia這將是因爲在數據庫中創建對象之前未設置「id」。 – 2016-09-02 16:52:08

+0

@PaulPettengill良好的捕獲 - 修復 – PinnyM 2016-09-02 16:58:28

0

我認爲在遷移中傳遞給:default的值不能是一個變量。我會嘗試這樣的回調:

before_save :initialize_order 

    def initialize_order 
     self.order = self.id 
    end 
+1

在這種情況下,建議不要使用before_save before_create。 – 2018-01-10 11:53:15