将ActiveRecord查询转换为sql

时间:2017-01-30 15:53:04

标签: ruby-on-rails postgresql activerecord

我需要编写一个迁移,根据另一个表中的现有记录在单独的(新)表中创建一些资源

这基本上就是我在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查询)

1 个答案:

答案 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;