Исправить несоответствие с полиморфной ассоциацией

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

Мои модели:

class User < ActiveRecord::Base
  belongs_to :userable, :polymorphic => true
  attr_protected :userable
end

class UserType1 < ActiveRecord::Base
  has_one :user, :as => :userable, :dependent => :destroy
end

class UserType2 < ActiveRecord::Base
  has_one :user, :as => :userable, :dependent => :destroy
end

Итак, проблема в том, что у меня есть некоторые записи в моей пользовательской таблице, не связанные с их полиморфной таблицей.

Пример записи (таблица пользователей):

id  userable_id userable_type
999 null        UserType1

И UserType1 не имеет никакого отношения к записи.

Поэтому я сделал запрос, чтобы обнаружить все ошибки ввода:

SELECT users.* from users where COALESCE(userable_id, 0) = 0'

Но я не знаю, как починить его чисто.

Моя идея - создать такой скрипт:

User.find_by_sql('SELECT users.* from users where COALESCE(userable_id, 0) = 0').each do |user|
  userable = user.userable_type.classify.constantize.new
  userable.user = user
  userable.save
  user.userable = userable
  user.save
end

Спасибо

1 ответ

class User
  alias_method :old_userable, :userable

  def userable
    old_userable || Userable.new
  end

end
Другие вопросы по тегам