我需要编写一个迁移,根据另一个表中的现有记录在单独的(新)表中创建一些资源
这基本上就是我在RoR中需要做的事情:
Note.all.each do |note|
object_id = sprintf '%09d', note.id
url_key = "notes/documents/#{object_id.scan(/.{3}/).join('/')}/original/#{note.document_file_name}"
note.documents.create(s3_key: url_key)
end
我需要遍历所有现有的笔记,然后为它们创建文档......(因为我正在将document
从笔记上的直接字段迁移到one_to_many
关联。)
sql
查询中的结果如何? (特别是postgresql查询)
答案 0 :(得分:0)
您正在寻找的是一个插入查询值的INSERT语句,该查询是标准SQL规范的一部分。你的问题更棘手的部分是将ID字段分解为子文件夹,我在这个解决方案中使用了CTE(但不是特别聪明):
WITH noteparts AS (
SELECT
id,
document_file_name,
substr(to_char(id, 'FM000000000'), 1, 3) as part_one,
substr(to_char(id, 'FM000000000'), 4, 3) as part_two,
substr(to_char(id, 'FM000000000'), 7, 3) as part_three
FROM notes
)
INSERT INTO documents (note_id, s3_key)
SELECT id, 'notes/documents/' || part_one || '/' || part_two || '/' || part_three || '/' || document_file_name
FROM noteparts;