使用创建时子记录中的信息更新 rails 父记录

Update a rails parent record with information from the child record upon creation

这是我的第一个 post,所以我不确定如何设置格式。 Lmk 如果我做错了什么。

我是 rails 的新手,我正在制作一个基本上只允许用户为其他用户提交 'grimes'(您可以将其视为评论)的应用程序。该应用程序有两个基本模型:用户和污垢。

用户模型:

class User < ApplicationRecord
    has_many :grimes
end

Grimes 模特:

class Grime < ApplicationRecord
  belongs_to :user
  validates :user, presence: true
end

每个污垢都有一个污垢属性,基本上是污垢的 1-5 等级。每个用户 都有一个污垢属性,我希望它是每个用户相关污垢的污垢总和。 IE。如果 user1 有两个污垢,g1 的污垢度为 3,g2 的污垢度为 2,则 user1 的污垢度应为 5。

当我想显示用户的肮脏程度时,我可以通过遍历每个用户的肮脏程度来做到这一点,但这似乎没有必要。相反,我只想在每次添加与用户相关的新污垢时增加用户的污垢,但我现在不知道该怎么做。

创建污垢的形式如下所示:

<%= 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 挂钩,它在第一次创建对象时只运行一次,但我在这里更喜欢 after_save 来调整 grime的肮脏更新了。