Недавно я унаследовал более старое приложение 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
Как лучше всего провести реорганизацию






Вы описываете односторонний ассоциация 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
PackageStateandPackagemodels are setup
но это неправильно. Ничто не мешает вам получить объект пакета с помощью ActiveRecord и вызвать для него destroy.
Вы должны спросить себя, как вы собираетесь использовать обе модели (особенно когда дело доходит до удаления пакетов), и определить, какая ассоциация будет работать лучше всего. Учитывая, что это унаследованное приложение, вам, вероятно, придется иметь дело с устаревшими данными, но это тема для другого дня.