2015-04-08 4 views
0

Я пытаюсь изменить тип модели от ActiveRecord::Base до архитектуры STI. Я пишу цикл, чтобы создать все, что нужно, как так:Rails 4: изменение модели от ActiveRecord до STI

EditedArticle.each do |e| 
    c = Component.create(name: e.name, body: e.body, type: 'EditedArticle', user_id: e.user_id, state: e.state, description: e.description, cover_id: e.cover_id) 
    e.publication.update_attribute(:component_id, c.id) 
end 

мне нужно запустить этот цикл так, что EditedArticle изменения из своей собственной таблицы к подтипу Component. Будет ли этот цикл работать? Уже класс начинается так:

class EditedArticle < Component 
    ... 

Так потенциально EditedArticle.each не вернет ничего. Должен ли я поддерживать EditedArticle < ActiveRecord::Base до тех пор, пока этот цикл не будет выполнен? Есть лучший способ сделать это? Это кажется ужасно взломанным.

+0

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

ответ

1

Вы можете получить доступ к статьям с сырым запросом SQL, как это:

ActiveRecord::Base.connection.execute('SELECT * FROM articles').each do |article| 
    # article is basically a hash of attributes (i.e. article['title']) 
end 
+0

Это так просто? Потрясающие. Спасибо. –

1

Если я правильно понимаю, у вас есть существующие EditedArticle модели в базе данных в таблице edited_articles и вы пытаетесь конвертировать те Component модели с типом EditedArticle.

Если да, то вы можете временно сохранить EditedArticle < ActiveRecord::Base до тех пор, пока вы запустили цикл и преобразовали существующие EditedArticle моделей для Component моделей с типом EditedArticle, в какой момент вы можете удалить существующую edited_articles таблицы и изменить модель для EditedArticle < Component, чтобы включить STI.

Надеюсь, это поможет.

+0

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

+0

Зачем вам нужно временно развертывать? 'rails c production' для запуска консоли в производственной базе данных. Запустите вышеуказанный цикл для преобразования. Разверните код активации STI. –

+0

Ах, конечно! Не знаю, что я там думал. Это имеет смысл. Благодаря! –

Смежные вопросы