2011-11-19 23 views
2

我想要創建一個散列,它將創建用戶的user_id +記錄的ID組合成一個MD5散列,但僅用於創建記錄。 (原因是冗長的,但是這提取了它)。Rails - 如何通過回調保存字段值(使用記錄的ID)?

我想:

class BlogPost < ActiveRecord::Base 

    after_create :hash_this 

    private 

    def hash_this 
    self.info_md5_hashed = (id.to_str + creator_user_id).my_MD5_hash_method 
    end 

end 

我怎樣才能確保info_md5_hashed字段實際上被保存到數據庫?如果我使用before_create我會認爲該ID尚不可用? :(
如果我使用after_create我會假設ID現已
- 但我需要做的另一個保存莫名其妙地存儲新計算info_md5_hashed字段值

+0

你可以發佈更多關於你試圖解決的更廣泛問題的具體信息嗎?如果我有更多的理解你爲什麼需要這個,我可以更新我的答案。在創建時生成附加到用戶的不可變ID(不是主鍵)是另一種選擇。一個UUID。 – d11wtq

回答

2

是的,你將不得不救?記錄兩次,因爲ID生成發生在數據庫中,唯一的方法是預先對一個ID進行序列化,但幾乎肯定沒有任何意義,你應該接受必須將記錄保存兩次;)

只需從after_create掛鉤中調用第二次存儲即可 - 可以這樣做(即不會出現循環重複問題),因爲第二次存儲獲勝再次重新觸發該掛鉤;)

n.b.如果你想避免雙重保存,你總是可以將散列基於你知道的獨特的東西,比如用戶名或者電子郵件。

+0

好吧,我把它放在控制器中,基本上調用BlogPost.new,然後是BlogPost.save?儘管如此,還是很擔心這會引發驗證。我可以做',:validate => false',但是如果我也有數據庫限制的驗證(最佳實踐),那麼我是否會遇到問題或者依賴於是否使用'save'或'save!' –

+0

也許update_attribute會幫助我嗎? –

+0

我不確定我關注。你指的是放在控制器中?你可以生成一個ID before_create,如果你真的必須的話(在數據庫中鎖定一個專用的序列表,選擇它的最高ID,增加這個數字,把它寫回表格並解鎖表格),但我誠實地說,優化掉第二次保存,如果你關心的是性能。 – d11wtq

相關問題