Мягкое удаление ассоциации has_and_belongs_to_many с использованием сброса драгоценного камня - PullRequest
1 голос
/ 23 октября 2019

Каков наилучший способ мягкого удаления has_and_belongs_to_many ассоциаций с использованием Discard Gem. С этой связью в базе данных есть таблица соединений, но без реальной модели Ruby on Rails.

Я попытаюсь объяснить на примере, скажем, есть 2 модели:

class Participant < ApplicationRecord
  has_and_belongs_to_many :company_employees
end


class CompanyEmployee < ApplicationRecord
  has_and_belongs_to_many :participants
end

Это создаст таблицу middle / join company_employees_participants в базе данных НО без какой-либо модели в Ruby on Rails. Где я могу сделать настройки для Discard Gem?

Любая идея, как я могу решить это требование, где нам нужно мягкое удаление в объединенных таблицах, используя ассоциацию has_and_belongs_to_many в Discard Gem?

discardgem: https://github.com/jhawthorn/discard

Я использую ruby ​​2.5.3, Rails 5.1.6, сброс (1.0.0)

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Я не думаю, что есть какой-нибудь драгоценный камень, который может мягко удалить отношение has_and_belongs_to_many. Наилучшим способом продвижения вперед, вероятно, будет рефакторинг ваших отношений и указание их с помощью has_many :through. Это позволяет вам настроить отношения, например, с мягким удалением. Изменение довольно простое:

  1. Создание миграции для переименования объединяемой таблицы.
  2. Создание новой модели и сопоставление имени таблицы.
  3. Изменение has_and_belongs_to_many до has_many :through.

Затем вы можете продолжить и следовать инструкциям Discard, чтобы включить мягкое удаление.

В общем, я бы избегал has_and_belongs_to_many в максимально возможной степени. Рано или поздно мне всегда приходилось настраивать модель объединения и пришлось реорганизовать код. has_many :through - это просто немного больше работы для первоначальной настройки, но он настолько гибок в будущем, что стоит затраченных усилий.

0 голосов
/ 24 октября 2019

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

Если вы хотите интегрировать вручную, изменения просты:

  • Сначала вам нужночтобы добавить миграцию, добавьте столбец deleted_at как тип поля данных datetime.

  • Затем вы можете написать область видимости для фильтрации данных так же, как и paranoia gem do, напримерwith_deleted, где вы можете проверить deleted_at IS NULL

  • Каждый раз, когда вы удаляете любую запись, вы можете установить deleted_at.

Я нашелодну ссылку на StackOverflow вы можете сослаться на это Как использовать драгоценный камень паранойи во многих ко многим ассоциациям

надеюсь, это поможет вам

...