Ruby On Rails, как удалить пользователя и использовать связанные данные во всех связанных моделях

0

Я новичок в Ruby ON Rails, мое приложение имеет 3 модели

class User < ActiveRecord::Base
 has_one :user_hobby
 has_one :user_interest
end

class User_hobby < ActiveRecord::Base
  belongs_to :User
 end

class User_interest < ActiveRecord::Base
  belongs_to :User

 end

Я хочу удалить все записи и связанные данные конкретного пользователя из модели и связанных с ней данных.

Я старался:

@user = User.joins(:User_details,:User_record).where(user_id:'user_id')
@user.destroy

но не работает, я хочу обойтись без использования зависимых:: уничтожить только из sql

  • 0
    я хочу обойтись без иждивенцев
  • 0
    Затем вы должны будете удалить все связанные записи вручную.
Показать ещё 2 комментария
Теги:

2 ответа

0

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

class User < ActiveRecord::Base
  has_one :user_hobby, dependent: :destroy
  has_one :user_interest, dependent: :destroy
end

class UserHobby < ActiveRecord::Base
  belongs_to :user
end

class UserInterest < ActiveRecord::Base
  belongs_to :user
end

Это вызовет метод .destroy для каждой связанной записи:

@user = User.find(1)
@user.destroy

Дополнительно @user = User.joins(:User_details,:User_record).where(user_id:'user_id') возвращает целую коллекцию записей, а не отдельную запись. .where(user_id:'user_id') также совершенно неверно, так как условие будет применяться к таблице users, и вы используете жестко закодированную строку litteral 'user_id' которая, я сомневаюсь, находится в столбце.

Если вы хотите, чтобы в отдельной записи использовались методы .find или .find_by.

@user = User.includes(:user_details, :user_record).find(params[:id])
@user.user_details.delete_all 
@user.user_record.delete if @user.user_record

.delete_all или .destroy_all следует использовать, если это ассоциация has_many или набор записей.

Но правильная настройка ассоциаций - это лучшая идея, поскольку модели должны отвечать за логику buisness в приложении MVC.

0

Просто, используйте dependent, используя любую ассоциацию в модели

Вы можете сделать так:

class User < ActiveRecord::Base
 has_one :user_hobby, dependent: :destroy  # destroys the associated user_hobby
 has_one :user_interest, dependent: :destroy  # destroys the associated user_interest
end

Чтобы узнать больше, перейдите по этой ссылке

зависимый

  • Контролирует, что происходит с ассоциированным объектом, когда его владелец уничтожен:

  • :destroy приводит к :destroy связанного объекта

  • :delete приводит к :delete связанного объекта непосредственно из базы данных (поэтому обратные вызовы не будут выполняться)

  • :nullify заставляет для внешнего ключа установить значение NULL. Обратные вызовы не выполняются.

  • :restrict_with_exception вызывает исключение, если возникает связанная запись

  • :restrict_with_error вызывает добавление ошибки владельцу, если есть связанный объект

Ещё вопросы

Сообщество Overcoder
Наверх
Меню