首页 > 解决方案 > Rails - 如何使用带有操作文本的批量导入?

问题描述

我正在构建一个 rails 6 应用程序,但我遇到了一个问题。

假设我有一个包含 3 个字段的表任务:

多亏了 ActionText,描述字段实际上是一个富文本字段。

我的问题是我有一个由 3 列(id、state、description)组成的 csv 文件,并且在应用程序初始化期间,我想使用批量导入来填充我的数据库。

通常,如果描述是一个普通的列,我会做这样的事情:

Task.insert_all(
 # My csv converted in array of hashes [{state: YY, description: ZZZZZZZ}]
)

但由于描述并不是表任务的真正属性,所以它不起作用。如何仍然使用批量导入来导入大量数据,但仍然使用 action_text 字段?

现在,我被迫使用“一个接一个”的插入,这需要很长时间!

感谢您提供任何线索。

标签: ruby-on-railsbulkinsertactiontext

解决方案


我认为最简单的方法是像这样拆分您的输入:

# 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为您的任务插入第二个,它将不起作用


推荐阅读