#ruby-on-rails
#ruby-on-rails
Вопрос:
у меня есть таблица, вызываемая users
, если я хочу удалить некоторого user
(пользователь может добавлять questions
и add respondents
(кто будет answer
на своем questions
)), мне нужно удалить его и передать его идентификатор людям, которые удалили этого человека. Так, например:
Ответ №1:
Конечно.
def destroy_and_transfer_to(user)
transaction do
questions.each do |q|
q.update_attribute(:user_id => user)
end
respondents.each do |r|
r.update_attribute(:user_id => user)
end
destroy
end
end
Теперь используйте этот метод вместо метода «уничтожить».
ИЛИ
вы можете придерживаться обратных вызовов, подобных этому
before_destroy :transfer_to
attr_accessor :user_who_takes_over
private
def transfer_to
if user_who_takes_over
questions.each do |q|
q.update_attribute(:user_id => user_who_takes_over)
end
respondents.each do |r|
r.update_attribute(:user_id => user_who_takes_over)
end
end
end
Тогда вы можете :
@user.user_who_takes_over = current_user
@user.destroy
Всего пара идей! Удачи!
Обновление: Весь код, который я предоставил выше, принадлежит вашей модели. В вашем контроллере у вас должен быть метод destroy
в вашем контроллере
def destroy
user = User.find(params[:id])
user.user_who_takes_over = current_user
if user.destroy
flash[:notice] = "User destroyed, all stuff transferred"
else
Rails.logger.debug(user.errors.inspect)
flash[:error] = "Error destroying user"
end
redirect_to :back
end
Измените, чтобы удовлетворить ваши потребности, конечно!
Комментарии:
1. спасибо за быстрый ответ, но что-то не так и у меня не работает: (я использую первый пример и не запускаю, использую второй и по-прежнему ничего, подождите, второй пример я должен написать в модели или контроллере?
2. посмотрите, что у меня есть => ActionController::UnknownAction (На уничтожение не отреагировало ни одно действие. Действия: проверка подлинности, создание, разрушение_и_трансфер_то, индексирование и обновление):
3. Большое спасибо, что вы помогаете, тратите свое время, но у меня все еще есть ошибки, когда я пишу это все, я получаю => Загрузка пользователя (0,2 мс) ВЫБЕРИТЕ * ИЗ
users
WHERE (users
.id
= 57) Загрузка пользователя (0,2 мс) ВЫБЕРИТЕ * ИЗusers
WHERE (users
.id
= ‘—: id n’) при использовании второго метода, где before_destroy4. Я предполагаю, что вы немного разбираетесь в rails! не беспокойтесь. вот, чтобы помочь.
5. попробуйте user = User.find(параметры[:id])