ruby-on-rails - Rails - 如何使用带有操作文本的批量导入?
问题描述
我正在构建一个 rails 6 应用程序,但我遇到了一个问题。
假设我有一个包含 3 个字段的表任务:
- ID
- 状态
- 描述
多亏了 ActionText,描述字段实际上是一个富文本字段。
我的问题是我有一个由 3 列(id、state、description)组成的 csv 文件,并且在应用程序初始化期间,我想使用批量导入来填充我的数据库。
通常,如果描述是一个普通的列,我会做这样的事情:
Task.insert_all(
# My csv converted in array of hashes [{state: YY, description: ZZZZZZZ}]
)
但由于描述并不是表任务的真正属性,所以它不起作用。如何仍然使用批量导入来导入大量数据,但仍然使用 action_text 字段?
现在,我被迫使用“一个接一个”的插入,这需要很长时间!
感谢您提供任何线索。
解决方案
我认为最简单的方法是像这样拆分您的输入:
# Tasks
tasks = { id: XX, state: YY, ... }
# Descriptions
descriptions = { record_type: 'Task', record_id: XX, name: 'description', body: 'Actual body' }
然后你可以做这样的事情:
Task.insert_all(tasks)
ActionText::RichText.insert_all(descriptions)
这是你要找的吗?
==================================================== ======
更新:
只是为了阐明这是如何工作的,我们需要了解该RichText
模型与 Rails 中的任何其他模型一样工作,但序列化信息如下所示:https ://github.com/rails/rails/blob/master/actiontext/app/models /action_text/rich_text.rb#L11
要查看真正从数据库中提取的内容,我们可以使用 helper *field*_before_type_cast
。例如:
descriptions = [ { record_type: 'Task', record_id: XX, name: 'description', body: '<p>EXAMPLE</p>' } ]
ActionText::RichText.insert_all(descriptions)
ActionText::RichText.last.body => <ActionText::Content....>
ActionText::RichText.last.body_before_type_cast => '<p>EXAMPLE</p>'
另外,请记住,每条记录可以有一个富文本(是 1 - N 多态关联)。因此,如果您尝试description
为您的任务插入第二个,它将不起作用
推荐阅读
- flutter - Flutter:我可以通过提供者更改状态栏颜色吗?
- excel - SAS中每列分为子列时如何导入excel文件
- python - 熊猫和重复日期的麻烦
- node.js - SyntaxError:我的模型中 JSON 输入意外结束
- javascript - 如何使用正确的生命周期使用来改进这个 React 组件?
- html - 在之前的 div 的右侧动态添加 X 个 div 并水平(而不是垂直)展开页面
- angular - 在角度模板(.html 文件)中使用 window.location.href 会出错
- javascript - 尝试在 for 循环中运行 jQuery.clone() 以附加元素 x 次,但获得的输出超出预期
- c++ - 如何将函数的返回值分配给c ++中的变量?
- algorithm - 求某个数范围内的指数积的个数