Полиморфизм
В вашей модели адресов вы можете использовать полиморфную ассоциацию , чтобы адрес принадлежал различным родительским моделям, если вы выполнили правильную миграцию:
class Address < ApplicationRecord
belongs_to :addressable, polymorphic: true
end
class User < ApplicationRecord
has_many :addresses, as: :addressable
end
class Event < ApplicationRecord
has_many :addresses, as: :addressable
end
Миграция данных
Вы можете просто сделать следующее
$ rails g migration AddAddressableToAddresses addressable:references:polymorphic
Если вы хотите сделать это вручную, полиморфная ассоциация просто добавляет идентификатор, тип и индекс для обоих:
def change
add_column :addresses, :addressable_id, :integer
add_column :addresses, :addressable_type, :string
add_index :addresses, [:addressable_id, :addressable_type]
end
Наследование в одной таблице (STI)
Относительно разных типов адресов, с разными стратегиями и методами проверки Наследование в одной таблице может быть решением .Вы сможете делать мысли вроде event.addresses
и получать все адреса событий с их типом.