使用创建时子记录中的信息更新 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
的肮脏更新了。
这是我的第一个 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
的肮脏更新了。