我试图找出如何运行将字符串添加到列开头的迁移。在这种特定情况下,我有一个名为url
的列,该列目前存储域之后的所有内容(例如/test.html
)。但是我现在想要在URL的开头添加一个字符串http://google.com
。对于此示例,此条目的结果字符串值url为http://google.com/test.html
。
如何通过迁移完成此操作?
答案 0 :(得分:3)
我不确定这是否属于您应该进行迁移的内容;通常,迁移会更改数据库的结构,而不是更改其内部数据的格式。
执行此操作的最简单,最快捷的方法根本不是在数据库中使用,而只是使该模型的url
方法返回"http://google.com#{read_attribute(:url)}"
之类的内容。如果你真的想要更改数据库中的数据,我会做一个rake任务来完成它,例如:
namespace :data do
task :add_domain do
Model.each do |model|
model.url = "http://google.com#{model.url}" if model.url !~ /google\.com/
model.save if model.changed?
end
end
end
如果这必须是您的迁移,那么您的迁移up
看起来非常类似于该rake任务的内部。 (或者它会直接调用rake任务。)
答案 1 :(得分:2)
您可以使用迁移或rake任务来执行此操作。
如果要将其作为迁移运行,
def up
execute("update TABLE set url = 'http://google.com' || url") // '||' concatenates string in postgres. Use the function provided by your database
end
def down
//this is little tricky. I would advice to leave this empty
end