Rails迁移前置列?

时间:2013-09-03 15:19:10

标签: ruby-on-rails activerecord migration

我试图找出如何运行将字符串添加到列开头的迁移。在这种特定情况下,我有一个名为url的列,该列目前存储域之后的所有内容(例如/test.html)。但是我现在想要在URL的开头添加一个字符串http://google.com。对于此示例,此条目的结果字符串值url为http://google.com/test.html

如何通过迁移完成此操作?

2 个答案:

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