如何在Rails中将Article表修改记录与Author表关联
解决方案步骤
- 修正模型关联的语法错误
你现有的Author模型中has_many关联配置错误,关联名称需要用复数形式:
class Author < ApplicationRecord # 修正为复数articles,对应Article模型 has_many :articles has_paper_trail end
- 给Article模型补全关联与日志配置
首先确保你的articles数据表已经添加了author_id外键字段,之后在模型中添加和Author的从属关联,同时开启PaperTrail操作日志记录,才能追踪Article的修改记录:
class Article < ApplicationRecord belongs_to :author # 开启Article的操作日志记录 has_paper_trail end
- 配置修改记录和Author的关联逻辑
PaperTrail默认会用whodunnit字段存储修改人的ID,你可以选择全局配置或者自定义Version模型完成关联:
- 全局配置方式:在
config/initializers/paper_trail.rb中添加如下配置
PaperTrail.config.track_associations = true # 配置whodunnit对应的关联模型为Author PaperTrail.config.version_user_alias = :author
- 自定义Version模型方式:生成PaperTrail迁移后,自定义Version模型添加关联
class Version < PaperTrail::Version belongs_to :author, foreign_key: :whodunnit, optional: true end
- 控制器补充配置
你需要在对应操作的控制器中设置当前操作的作者ID,确保修改记录能正确关联到对应的Author对象:
# 示例:在ArticlesController的操作前置钩子中设置whodunnit before_action do PaperTrail.request.whodunnit = current_author.id if current_author end
配置完成后就可以直接调用关联获取修改人信息:
# 获取某篇文章的所有修改记录 article = Article.first article.versions.each do |version| # 直接获取修改本条记录的Author对象 modifier = version.author puts "修改人:#{modifier.name},修改时间:#{version.created_at}" end
如果你需要关联的是文章的所属作者而非修改人,直接通过article.author就能获取对应的作者信息,所有修改记录也会保留文章对应的author_id变更历史。
内容的提问来源于stack exchange,提问作者Anthony zeng
相关产品推荐
相关产品推荐

