[英]Update a rails parent record with information from the child record upon creation
這是我的第一篇文章,所以我不確定如何格式化。 Lmk 如果我做錯了什么。
我對 Rails 還很陌生,我正在制作一個基本上只允許用戶為其他用戶提交“grimes”(您可以將其視為評論)的應用程序。 該應用程序有兩個基本模型:用戶和污垢。
用戶 Model:
class User < ApplicationRecord
has_many :grimes
end
格萊姆斯 Model:
class Grime < ApplicationRecord
belongs_to :user
validates :user, presence: true
end
每個 grime 都有一個 griminess 屬性,基本上是 grime 的 1-5 等級。 每個用戶還有一個 griminess 屬性,我希望它是每個用戶相關 grimes 的 griminess 的總和。 IE。 如果 user1 有兩個 grimes,g1 有 griminess 3,g2 有 griminess 2,那么 user1 griminess 應該是 5。
當我想顯示用戶的污垢時,我可以通過遍歷每個用戶的污垢來做到這一點,但這似乎非常不必要。 相反,我只想在每次添加與用戶相關的新污垢時增加用戶的污垢,但我現在不知道該怎么做。
創建 grime 的表單如下所示:
<%= form_for @grime do |f| %>
Title: <%= f.text_field :title %><br />
Description: <%= f.text_area :description %><br />
Griminess Level: <%= f.select :griminess, (0..5) %>
Select Grimer: <%= f.collection_select(:user_id, User.all, :id, :name) %><br />
<%= f.submit %>
<% end %>
我的 grimes#create 看起來像這樣:
def create
@grime = Grime.new(grime_params)
if @grime.save
flash[:success] = "Grime Saved Successfully"
redirect_to @grime
else
flash[:error] = "Error: Could Not Save Grime!"
render :new
end
end
我覺得我應該能夠在 create 方法中執行類似@grime.user.griminess += @grime.griminess
的操作,但這似乎對我不起作用。 誰能推薦一個更好的方法來解決這個問題?
在Grime
中添加after_save
鈎子,該鈎子會在grime被保存時調用該grime上的方法。
class Grime < ApplicationRecord
after_save :update_user_griminess # register the callback
belongs_to :user
validates :user, presence: true
#callback body
def update_user_griminess
user.griminess = user.grimes.sum(:griminess) # update user griminess as sum of it's all grimes' griminess
user.save
end
end
ActiveRecord 中有一個替代的after_create
鈎子,它在第一次創建 object 時只運行一次,但我更喜歡after_save
在這里調整grime
的污垢更新的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.