我试图弄清楚如何运行将字符串添加到列开头的迁移。在这种特定情况下,我有一个名为的列,该列url
当前存储域之后的所有内容(例如/test.html
)。但是我现在想http://google.com
在 url 的开头添加一个字符串。在本例中,该条目的 url 的结果字符串值为http://google.com/test.html
.
我如何通过迁移来实现这一点?
我试图弄清楚如何运行将字符串添加到列开头的迁移。在这种特定情况下,我有一个名为的列,该列url
当前存储域之后的所有内容(例如/test.html
)。但是我现在想http://google.com
在 url 的开头添加一个字符串。在本例中,该条目的 url 的结果字符串值为http://google.com/test.html
.
我如何通过迁移来实现这一点?
我不确定这是否真的有资格进行迁移;通常,迁移会更改数据库的结构,而不是更改其中数据的格式。
最简单和最快的方法是根本不用在你的数据库中到处乱跑,而是让该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 任务。)
您可以使用迁移或 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