You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rails中将Article表修改记录与Author表关联

解决方案步骤

  1. 修正模型关联的语法错误
    你现有的Author模型中has_many关联配置错误,关联名称需要用复数形式:
class Author < ApplicationRecord
  # 修正为复数articles,对应Article模型
  has_many :articles
  has_paper_trail
end
  1. 给Article模型补全关联与日志配置
    首先确保你的articles数据表已经添加了author_id外键字段,之后在模型中添加和Author的从属关联,同时开启PaperTrail操作日志记录,才能追踪Article的修改记录:
class Article < ApplicationRecord
  belongs_to :author
  # 开启Article的操作日志记录
  has_paper_trail
end
  1. 配置修改记录和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
  1. 控制器补充配置
    你需要在对应操作的控制器中设置当前操作的作者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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:06:04