0

С течением времени мое приложение Rails имеет различные перезаписи, а в некоторых случаях и неправильные ассоциации моделей.Найти и уничтожить зависимые записи

В настоящее время мой User модель has_many :posts и метод его destroy правильно удаляет все зависимые Post с, но в то время, когда все было неправильно написано этого не произошло. У меня теперь осталось несколько записей Post, которые вызывают ошибки, потому что их Пользователь не существует.

Какой бы самый эффективный способ вручную фильтровать все записи Post, проверить, существует ли его Пользователь, и если он не уничтожит это сообщение?

я себе что-то вроде:

Post.all.select{ |post| post.user.nil? }.destroy 

Но это кажется невероятно неэффективным для тысяч записей. Мне бы хотелось узнать, как это сделать. Спасибо!

ответ

0

быстрый способ, вероятно, будет делать это каталог в консоли дб, но если у вас есть другие зависимые отношения и ActiveRecord обратные вызовы, которые вам нужно уволят, вы могли бы сделать что-то вроде:

Post.where("id in (select p.id from posts p left outer join users u on p.user_id = u.id where u.id is null)").destroy_all 
1

любая причина, по которой вы не можете сделать это непосредственно в базе данных?

delete from posts where user_id not in (select id from users); 
0

Удалить сообщения бесхозных с помощью

  • Если вы хотите, чтобы уничтожить зависимые ассоциации с Post и запускать обратные вызовы

    Post.where("user_id NOT IN (?)", User.pluck(:id)).destroy_all 
    
  • Если вы просто хотите удалить сообщения

    Post.where("user_id NOT IN (?)", User.pluck(:id)).delete_all 
    

Вот один хороший пост о finding and deleting orphan records

 Смежные вопросы

  • Нет связанных вопросов^_^