簡體   English   中英

在創建時使用來自子記錄的信息更新 rails 父記錄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM