2012-05-30 6 views
1

В настоящее время я работаю над проектом, в котором я использую модель STI, и хочу конвертировать одну запись в другой тип без создания новой записи. Есть наблюдатели, которые подключены к огню при создании новой модели, однако я не хочу, чтобы эти наблюдатели стреляли и хотели бы поддерживать один и тот же идентификатор. Есть ли простой способ конвертировать запись из одной модели в другую через ORM ?, без использования SQL?Rails STI change type

Приветствия

+0

У вас есть базовая модель? Например, медведь, кошка, собака - все млекопитающие? Если это так, вы можете использовать эту модель и просто изменить атрибут обновления, чтобы изменить флаг типа. Можете ли вы поделиться с нами своими моделями? –

+0

Возможный дубликат [Изменение типа класса ActiveRecord в Rails с одиночным наследованием таблицы] (http://stackoverflow.com/questions/3262415/changing-type-of-activerecord-class-in-rails-with-single-table- наследование) –

+0

Этот вопрос является дубликатом http://stackoverflow.com/q/3262415/41283 –

ответ

2

#becomes может делать то, что вы хотите:

class Foo < ActiveRecord::Base 
end 

class Bar < Foo 
end 

class Baz < Foo 
end 

baz = Baz.create({}) 
bar = baz.becomes(Bar) 

В этот момент, вы все еще будете иметь baz запись в foos таблице. Вы должны убедиться, что сохранение bar не вызывает проблем.

0

becomes! не работал для меня, как указано в https://stackoverflow.com/a/26091638/1935918. Вместо этого я рекомендую использовать update_column:

def update 
    @company = Company.find(params[:id]) 
    # This separate step is required to change Single Table Inheritance types 
    new_type = params[:company][:type] 
    if new_type != @company.type && Company::COMPANY_TYPES.include?(new_type) 
     @company.update_column :type, new_type 
    end 

    @company.update(company_params) 
    respond_with(@company) 
    end