Наличие нескольких типов адресов и ассоциаций с моделью, используя полиморфный способ? - PullRequest
0 голосов
/ 28 марта 2019

Пусть пользователь и модели событий.

Я хотел бы добавить модель адреса с этими вариантами использования:

  • Адрес имеет разные типы, например BillingAddress, DeliveryAddress и т. Д. (Я должен использовать наследование?)
  • Пользователь может иметь несколько адресов разных типов. Например, пользователь может иметь 2 платежных адреса и 3 адреса доставки.
  • Событие также может иметь несколько адресов разных типов.

Какой самый простой способ обработки таких сценариев использования в Rails? Или есть какой-нибудь драгоценный камень, чтобы справиться с этим?

1 Ответ

1 голос
/ 28 марта 2019

Полиморфизм

В вашей модели адресов вы можете использовать полиморфную ассоциацию , чтобы адрес принадлежал различным родительским моделям, если вы выполнили правильную миграцию:

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 и получать все адреса событий с их типом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...