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

使用Prawn生成PDF时,如何在表格单元格中获取关联模型内容?

在Prawn/Prawn-Table中展示教育目标(EO)及关联用例(UC)的解决方案

我来帮你搞定这个在PDF表格里关联展示EO和UC的问题!结合你给出的多对多模型关系,我整理了具体的实现方案和优化技巧:

第一步:优化数据查询(避免N+1性能问题)

因为EducationalObjective和UseCase是多对多关联,首先要确保查询EO时预加载关联的UC,这样能避免多次数据库查询,提升PDF生成效率:

# 替换成你实际的章节筛选条件,比如按chapter_id过滤目标章节的EO
target_educational_objectives = EducationalObjective.includes(:use_cases).where(chapter_id: your_chapter_id)

第二步:构建表格行数据,填充关联UC

接下来把EO和对应的UC列表转换成Prawn表格能识别的格式,我们可以把每个EO的UC整理成带项目符号的字符串,填充到对应单元格中:

# 初始化Prawn文档,可根据需求调整页面尺寸和边距
pdf = Prawn::Document.new(page_size: 'A4', margin: [20, 20, 20, 20])

# 定义表格表头
table_header = ["教育目标(EO)", "关联用例(UC)"]

# 构建表格的行内容
table_rows = target_educational_objectives.map do |eo|
  # 把每个UC转换成带项目符号的条目,可根据需求调整UC展示内容(比如名称、ID、描述)
  uc_entries = eo.use_cases.map { |uc| "- #{uc.name} (ID: #{uc.id})" }.join("\n")
  # 处理无关联UC的情况,显示友好提示
  uc_entries = "*暂无关联用例*" if uc_entries.empty?
  # 返回当前EO对应的表格行数据(替换成你实际要展示的EO字段,比如eo.description)
  [eo.title, uc_entries]
end

# 生成表格并设置样式
pdf.table([table_header] + table_rows, 
          cell_style: { padding: [10, 15], valign: :top, inline_format: true },
          header: true) do
  # 自定义表头样式
  row(0).font_style = :bold
  row(0).background_color = '#f0f0f0'
  # 根据内容调整列宽
  columns(0).width = 250
  columns(1).width = 350
end

# 保存PDF文件
pdf.render_file("chapter_educational_objectives.pdf")

关键优化点说明

  • inline_format: true:开启后可以在单元格内容中使用Prawn的内联格式(比如*加粗*),用来高亮空数据提示或者重点UC信息
  • valign: :top:确保单元格内容从顶部开始排列,避免长内容和短内容对齐混乱
  • 预加载关联数据:includes(:use_cases)能一次性查询所有EO的关联UC,避免循环每个EO时重复查询数据库
  • 空数据处理:给无关联UC的EO设置占位文本,让表格展示更整洁

额外扩展建议

如果需要更复杂的UC展示格式(比如每个UC单独占行、添加分隔线),可以考虑使用嵌套表格,或者用text_box在单元格内手动绘制UC列表,不过要注意调整单元格的高度自适应逻辑。

内容的提问来源于stack exchange,提问作者theorix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:53:06