从已连接的表中删除活动记录条目而不删除原始记录

时间:2015-01-07 04:02:25

标签: sql ruby-on-rails ruby join activerecord

我正在开发一个用ruby on rails编写的Web应用程序

数据库中存在一个课程模型。 用户可以保存他/她计划采取的课程。 我通过使用current_user.courses表来实现这一目标。 (courses_users)

但是,如果用户希望删除已保存的课程,并且我发出带有该ID的删除请求,那么

current_user.courses.find_by(id: params[:id]).destroy

我最终删除了联接表中的条目和courses表中的条目。我通过查看服务器日志确认了这一点并找到了

DELETE FROM `courses_users` WHERE `courses_users`.`course_id` = 219
SQL (0.4ms)  DELETE FROM `courses` WHERE `courses`.`id` = 219

当我只想要第一个时,执行上述两个操作。

有没有办法只删除连接表中的条目?或者这违背了联合表的性质?如果是这样,是否有更有效的方法来实现此功能?

任何帮助将不胜感激,如果你想让我发布任何其他信息,请询问。

谢谢,

编辑:两个模型之间的关系:

用户has_and_belongs_to_many课程

和课程has_and_belongs_to_many用户

2 个答案:

答案 0 :(得分:2)

你的代码说要破坏课程,这就是ActiveRecord正在做的事情。

您想删除关联,而不是破坏用户或课程。

解决方案是使用collection.delete(object, …)

  • 通过从连接表中删除关联,从集合中删除每个对象。

  • 这不会破坏对象。

示例代码:

def delete_user_course_association(user_id, course_id)
  user = User.find(user_id)
  course = user.courses.find(course_id)
  user.courses.delete(course) if course 
end

请参阅Rails API ActiveRecord Associations has_and_belongs_to_many

答案 1 :(得分:2)

以下行会删除ID为params[:id]

的课程记录
current_user.courses.find_by(id: params[:id]).destroy

我认为你的意思是:

  current_user.courses.delete( params[:id] )