在after_update操作中传递变量

Passing a variable in an after_update action

提问人:NaguiHW 提问时间:1/24/2023 最后编辑:mechnicovNaguiHW 更新时间:1/25/2023 访问量:46

问:

我有一个模型:UserProfile

class UserProfile < ApplicationRecord
  after_update :check_changes

  def check_changes
    AuditRecord.create(account_id: self.id, fields: self.saved_changes , account_type: 'UserProfile', admin_id: 3) if self.saved_changes?
  end
编号 user_id 名字 last_name
1 1 John 母鹿
2 2 酒吧

和型号:AuditRecord

编号 account_type account_id admin_id
1 用户配置文件 1 {} 3
2 用户配置文件 2 {} 3

这将保存配置文件的所有更新,但可以由不同的管理员进行更新。AuditRecord

如何发送以运行admin_id?因为现在总是 3 岁。check_changes

ruby-on-rails 回调 rails-models

评论

1赞 mechnicov 1/25/2023
after_update自动调用。你不能在那里动态地传递一些变量

答:

0赞 Hrutvik Yadav 1/24/2023 #1
  1. 如果我理解正确,您只想将admin_id传递给 AuditRecord,这意味着您需要另一个模型,这在某种程度上相关。AdminAuditRecord
  2. 从生成模型开始,设置适当的活动记录关联和引用。Rails 文档Admin
  3. 您现在应该能够访问关联,具体取决于您设置关联的方式。admin.auditrecords

评论

0赞 NaguiHW 1/24/2023
对不起,我有一个模型和一个模型,问题是我有一个更新的函数,但是每个管理员都可以更新,但我不知道在模型中的check_changes函数中传递admin_idAdminUserUserProfileUserProfileUserProfile
0赞 Hrutvik Yadav 1/25/2023
在这种情况下,请检查“关联扩展”和“关联回调”。这应该会有所帮助。根据这些文章,您可以使用关联的参数定义自定义方法
0赞 mechnicov 1/25/2023 #2

after_update自动调用。你不能在那里动态地传递一些变量

但是您可以在管理员之间平均分配任务

class AuditRecord < ApplicationRecord
  class << self
    def most_free_admin_id
      select(:admin_id).
        group(:admin_id).
        order('COUNT (admin_id)').
        first.
        admin_id
    end
  end
end

AuditRecord.most_free_admin_id将生成这样的 SQL

SELECT admin_id
FROM audit_records
GROUP BY admin_id
ORDER BY COUNT (admin_id)
LIMIT 1;

它将返回审核记录最少的管理员的 ID

此外,最好不要在更新后创建此类记录,而是在提交后创建此类记录,当记录 100% 保存在数据库中时。为此目的更好after_update_commit

同样在 Ruby 中,我们只在没有它的情况下使用它self.

最后,您可以在模型中应用它

class UserProfile < ApplicationRecord
  after_update_commit :check_changes

  private

  def check_changes
    AuditRecord.create(
      account_id: id,
      fields: saved_changes,
      account_type: 'UserProfile',
      admin_id: AuditRecord.most_free_admin_id
    )
  end
end