2013-09-03 5 views
0

Я пытаюсь выяснить, как выполнить миграцию, которая добавляет строку в начало столбца. В этом конкретном случае у меня есть столбец с именем url, который в настоящее время сохраняет все после домена (например, /test.html). Однако теперь я хочу добавить одну строку http://google.com в начало URL-адреса. В случае этого примера результирующее строковое значение url для этой записи будет http://google.com/test.html.Rails Migration Prepend Column?

Как я могу выполнить это с помощью миграции?

ответ

3

Я не уверен, что это действительно квалифицируется как нечто, что вы должны внести в миграцию; как правило, миграция изменяет структуру вашей базы данных, а не изменяет формат данных внутри нее.

Самый простой и быстрый способ сделать это не будет futz в вашей базе данных, а вместо этого просто сделать метод url этой модели вернуть что-то вроде "http://google.com#{read_attribute(:url)}". Если вы действительно хотите изменить в своей базе данных, я хотел бы сделать реки задачу, чтобы сделать это, что-то вроде:

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 будет выглядеть очень похоже к внутренним условиям этой грабли. (Или это вызовет эту задачу рейка напрямую.)

+0

Поэтому я предложил поставить его в миграции является то, что движение вперед будут разные домены. Таким образом, это не так просто, как поиск домена, но да, я мог бы добавить регулярное выражение домена. Мне нравится этот подход, хотя и поставил задачу. –

2

Для этого вы можете использовать миграцию или задачу рейка.

Если вы хотите, чтобы запустить его как миграция,

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