2016-04-03 82 views
0

我試圖在使用after_commit回調創建對象之後爲對象生成一個獨特的slu slu。在rails中創建活動記錄對象之後產生一個slu 012

after_commit :create_slug, on: :create 

def create_slug 
    self.slug = generate_slug 
    self.save 
end 

當我嘗試保存該對象時,出現「堆棧級別過深」錯誤。我假設,因爲我保存對象,它一次又一次地被稱爲after_commit回調。

在這種情況下生成和保存獨特的slu What的最佳方法是什麼?

回答

2

我建議在創建時使用after_validation回調而不是after_commit。您將調用多個交易,這不是此回調的意圖。我會做的是這樣的:

after_validation(on: :create) do 
    self.slug = generate_slug 
end 

還要確保在generate_slug裏面沒有保存動作。該方法應該簡單地返回一個值來插入slug屬性。

+0

我thnk這兩種方法和@lei_liu工作。任何想法是更好的方法使用? – Lorenz

+0

取決於您是否需要在創建段塞之前將數據保存在磁盤中。當我讀取你的代碼時,我假定發生了一些事情,需要在生成slug之前創建數據,就像數據庫交互在某處創建靜態路由一樣,或者發送一封電子郵件,如果數據未被持久化在生成slu before之前。如果你沒有根據數據庫中的數據做一些生成slug的工作,那麼只有對數據庫進行單一事務(我的建議),性能會更好。 –

+0

[bkoski/slug](https://github.com/bkoski/slug/blob/master/lib/slug/slug.rb#L32)創建slu uses時使用'before_validation'回調。 [FriendlyId/friendly_id](https://github.com/norman/friendly_id/blob/8069fc9959215e5f4872927928b3b7a95e9beacd/lib/friendly_id/slugged.rb#L250)使用'before_validation'將slug和'after_validation'設置爲unset_if_invalid。 –

0

使用不會觸發回調等的方法:update_column

def create_slug 
    update_column('slug ', generate_slug) 
end 
相關問題