2009-12-21 95 views
1

我有一個用戶模型,檢查值是否已更改before_save(通過運行User.zipcode_changed?)。這個想法是,如果有的話,這將排隊延遲的工作。放置_changed的正確位置在哪裏? Rails中的方法?

問題是,當我從頭開始遷移應用程序,我得到一個錯誤:

An error has occurred, all later migrations canceled: 

undefined method `postcode_changed?' for #<User:0x105db6158> 

因此,在這裏我應該把這些?模型是錯誤的地方?

回答

6

從頭開始簽出新項目時,不應使用遷移來構建數據庫。 您應該使用rake db:schema:load代替。

讓我告訴你爲什麼。

讓我們假設你在遷移10 創建一個新的Post模型後表在遷移11,你執行的Post模型的一些特殊的闡述。 過了一段時間,您決定放棄Post模型和帖子表,因爲不再需要。

六個月後,您從頭開始簽出項目。如果您嘗試運行rake db:migrate,遷移11將失敗,抱怨丟失的模型。確實,這個模型已經在很多個月前被刪除了,而且已經不再可用了。

相反,如果您運行rake db:schema:load,則將使用正確的模式版本初始化數據庫。

談到遷移,如果您剛剛創建了郵政編碼方法,並且您正嘗試使用_changed?在同一個遷移中的魔法方法,您需要在之前重新加載模式。

class MigrationFile < ... 
    self.up 
    add_column :user, :postcode, :string 

    User.all.each { |user| puts user.postcode_changed? } # will fail 

    User.reset_column_information 
    User.all.each { |user| puts user.postcode_changed? } # now it works 
    end 
    ... 
end 
+0

我應該指出,這段代碼是在模型中,而不是控制器,但我明白了你的觀點。 – 2009-12-22 09:46:18

+0

我從來沒有談論過控制器。 – 2009-12-22 14:46:12

1

你說這兩個zipcode_changed?和postcode_changed?在你的問題。數據庫中的實際列名稱是什麼 - 郵政編碼或郵政編碼? ActiveRecord只會創建_changed?實際列名的簡便方法。

0

你在做什麼是合理的模型代碼,但在遷移中不太好。

在您的遷移中使用模型代碼是有問題的,因爲這樣的問題。我建議堅持使用面向SQL的代碼。

相關問題