Rails - 如何对操作文本使用批量导入?

Rails - How to use bulk import with action text?

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

假设我有一个 table 任务,它有 3 个字段:

由于 ActionText,描述字段实际上是一个 rich_text 字段。

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

通常情况下,如果 description 是一个普通的列,我会这样做:

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

但由于描述并不是 table 任务的真正属性,因此它不起作用。我怎样才能仍然使用批量导入来导入大量数据,但仍然使用 action_text 个字段?

现在,我被迫使用 "one by one" 插入,这需要很长时间!

感谢您提供任何线索。

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

# 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

要查看真正从数据库中提取的内容,我们可以使用助手 *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,它将不起作用