В этом вам могут помочь два подхода.
Одним из них является введение промежуточной модели, которая обрабатывает наборы телефонных номеров. Таким образом, ваши Record и UserRecord могут принадлежать к этой модели коллекции, и оттуда могут быть связаны номера телефонов и другая контактная информация. У вас получаются отношения, которые выглядят так:
class Record < ActiveRecord::Base
belongs_to :address_book
delegate :phone_numbers, :to => :address_book
end
class UserRecord < ActiveRecord::Base
belongs_to :address_book
delegate :phone_numbers, :to => :address_book
end
class AddressBook < ActiveRecord::Base
has_many :phone_numbers
end
Этот вид повторной обработки может быть выполнен с помощью миграции и небольшого количества SQL для заполнения столбцов в таблице address_books на основе того, что уже присутствует в записях.
Альтернатива состоит в том, чтобы сделать UserRecord производным от STI типом записи, чтобы вам не приходилось иметь дело с двумя разными таблицами при определении связей.
class Record < ActiveRecord::Base
has_many :phone_numbers
end
class UserRecord < Record
end
Обычно все, что вам нужно сделать, это ввести строковый столбец типа в вашу схему, и вы можете использовать STI. Если срок действия записей UserRecord истекает через определенное время, можно легко удалить их, используя что-то вроде:
UserRecord.destroy_all([ 'created_at<=?', 7.days.ago ])
Используя подход STI, вы должны быть осторожны, чтобы ограничить выбор, чтобы вы извлекали только постоянные или временные записи в зависимости от того, что вы собираетесь делать. Поскольку UserRecord является производным от Record, вы обнаружите, что они также загружаются при загрузках по умолчанию, таких как:
@records = Record.find(:all)
Если это вызывает проблему, вы всегда можете использовать Record в качестве абстрактного базового класса и создать производный класс PermanentRecord, чтобы исправить это:
class PermanentRecord < Record
end
Обновите во время миграции, используя что-то вроде:
add_column :records, :type, :string
execute "UPDATE records SET type='PermanentRecord'"
Тогда вы можете использовать PermanentRecord вместо Record для всего вашего существующего кода, и он не должен непреднамеренно извлекать записи UserRecord.