Ruby on Rails: две модели имеют / Many и Belongs_to

Недавно я унаследовал более старое приложение rails, модель которого называется Package. Одна из задач - разрешить удаление пакетов. Однако в настоящее время это невозможно из-за способа настройки моделей PackageState и Package. Вот пример:

Модель упаковки:

class Package < ActiveRecord::Base
  belongs_to :package_state, class_name: 'PackageState', foreign_key: :package_state_id
  has_many :package_states
end

И PackageState:

class PackageState < ActiveRecord::Base
  has_many :packages, :class_name => 'Package'
end

Как лучше всего провести реорганизацию

"в настоящее время это невозможно из-за способа настройки моделей PackageState и Package" - в чем конкретно проблема / вопрос? Вы получаете ошибки при попытке удалить? Если так, то кто они? Если нет, каково текущее поведение?
jvillian 09.08.2018 17:56
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы описываете односторонний ассоциация has_and_belong_to_many (HABTM) между Package и PackageState, который будет выглядеть так:

class Package < ActiveRecord::Base
  has_and_belongs_to_many :package_states
end

class PackageState < ActiveRecord::Base
  has_many :packages
end

В принятом ответе этого ТАК вопрос есть отрывок об односторонних ассоциациях HABTM:

Functionally yes, but semantically no. Using HABTM in a "one-sided" fashion will achieve exactly what you want. The name HABTM does unfortunately insinuate a reciprocal relationship that isn't always the case. Similarly, belongs_to :foo makes little intuitive sense here.

Don't get caught up in the semantics of HABTM and the other association, instead just consider where your IDs need to sit in order to query the data appropriately and efficiently. Remember, efficiency considerations should above all account for your productivity.

Вы также заявили, что

that's not currently possible, due to the way the PackageState and Package models are setup

но это неправильно. Ничто не мешает вам получить объект пакета с помощью ActiveRecord и вызвать для него destroy.

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

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