2017-06-20 126 views
0

我有一個額定值模型,用戶可以評價一個對象......等級發生後,我想自動創建一個RatingLog記錄,以便用戶可以看到所有等級的列表。創建記錄後,Rails如何自動創建關聯記錄?

型號:Rating.rb和RatingLog.rb

我看到RatingLog包括的不僅僅是等級等事件的列表,像徽章等..非常相似的StackOverflow。

什麼是正確的方式與Rails 5,填寫評級後創建RatingLog.rb ...我應該使用after_create Rating.rb?我應該創建一些其他類型的回調?很想聽聽是落實在Rails的上述5

謝謝

+3

'after_create'聽起來不錯.. –

+1

+1'after_create'。作爲一個方面說明:對於類似於StackOverflow_的東西,您應該非常好地考慮您的db設計;並可能考慮使用_service objects_。 – Gerry

+0

什麼是服務對象? – AnnaSm

回答

0

如果這被認爲是好的,我不知道正確的方式...但我做的創建行動中這一權利在你的情況,我會想: RatingController

def create 
... 
    @ratinglog = RatingLog.create 
     @ratinglog.user = current_user 
     @ratinglog.rating = @rating.id 
     @ratinglog.comment_type = "server generated" 
     @ratinglog.comment = "#{current_user.fname} #{current_user.lname} submitted a rating of #{@rating.content}" 
     @ratinglog.save! 
... 
end 
1

我假設你有型號:

class Rating 
    has_one :rating_blogs 
end 

class RatingBlog 
    belongs_to :rating 
end 

因此,建立一個評價博客AFER評級是CREA泰德,你可以這樣做:

@rating = Rating.new 
@rating.build_rating_blog(some_message: 'Message') 
@rating.save 

所以創建@rating時,評級博客將被創建並與@rating有關。

0

另一個選項是after_commit回調,它只會在保存評級對象時運行。

after_create也可以工作,但如果您在嘗試保存您的RatingLog時發生錯誤,那麼您創建的評分記錄也將不會保存(結帳this answer)。

所以,這取決於你想要的行爲,選擇一個:

  • after_commit RatingLog錯誤不會影響評級節省
  • after_create RatingLog錯誤回滾評級節省

另外:

  1. 從你的帖子中不完全清楚,但它的聲音像評級和評級日誌持有非常相似的數據?或者如果RatingLog會保存其他事件的日誌,可以將其命名爲其他事件。
  2. 看看這個answer on naming conventions - 該公約模型文件命名爲rating.rb和rating_log.rb
相關問題