У меня есть три модели:Soft удалить с ассоциациями
Пользователь:
class User < ActiveRecord::Base
has_many :posts, :dependent => :destroy
scope :active, -> { where(deleted: false) }
end
сообщение:
class Post < ActiveRecord::Base
belongs_to :user
has_many :comments, :dependent => :destroy
scope :active, -> { where(deleted: false) }
end
Комментарий:
class Comment < ActiveRecord::Base
belongs_to :post
scope :active, -> { where(deleted: false) }
end
Теперь я делаю мягкое удаление для User
и я столбец с именем deleted
во всех трех таблицах (User, Post, Comment
)
Пользователь уничтожить метод:
def destroy
@user = user.find(params[:id])
if @user.update_attributes(deleted: true)
@user.posts.each do |post|
post.comments.update_all(deleted: true)
end
@user.posts.update_all(deleted: true)
end
end
выше реализация занимает больше времени, когда нет. почт и комментарии высоки, и это также создает N + 1 проблема запроса ..
То же, что выше я реализовал destroy
метод Post
, я не знаю, как эффективно это сделать ..
Я не Я не хочу использовать какой-либо драгоценный камень.
Пожалуйста скажите мне лучший способ сделать мягкое удаление для такого рода ассоциаций ..
Вам действительно нужно удалить сообщения? Вместо этого вы можете использовать их, включая модель пользователя, когда вы их извлекаете. Маркировка всех потомков как удаленных действительно не требуется. – Matt
Лучшим способом было бы использовать камень для этого: Паранойя (https://github.com/rubysherpas/paranoia) или ActsAsParanoid (https://github.com/ActsAsParanoid/acts_as_paranoid). –
@gen Плакат утверждает, что он не хочет использовать драгоценный камень. – Matt