Я новичок в 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
Когда вы настраиваете модель с ассоциациями, вы также должны потратить время на настройку обратных вызовов для обработки удаленных сиротских строк.
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.
Просто, используйте 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
вызывает добавление ошибки владельцу, если есть связанный объект