提问人:NaguiHW 提问时间:1/24/2023 最后编辑:mechnicovNaguiHW 更新时间:1/25/2023 访问量:46
在after_update操作中传递变量
Passing a variable in an after_update action
问:
我有一个模型: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
答:
0赞
Hrutvik Yadav
1/24/2023
#1
- 如果我理解正确,您只想将admin_id传递给 AuditRecord,这意味着您需要另一个模型,这在某种程度上相关。
Admin
AuditRecord
- 从生成模型开始,设置适当的活动记录关联和引用。Rails 文档
Admin
- 您现在应该能够访问关联,具体取决于您设置关联的方式。
admin.auditrecords
评论
0赞
NaguiHW
1/24/2023
对不起,我有一个模型和一个模型,问题是我有一个更新的函数,但是每个管理员都可以更新,但我不知道在模型中的check_changes函数中传递admin_idAdmin
User
UserProfile
UserProfile
UserProfile
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
评论
after_update
自动调用。你不能在那里动态地传递一些变量