【问题标题】:Deleting an active record entry from a joined table without deleting the orginal从联接表中删除活动记录条目而不删除原始记录
【发布时间】:2015-03-04 22:06:00
【问题描述】:

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

数据库中存在课程模型。 用户可以保存他/她计划参加的课程。 我通过拥有一个 current_user.courses 表来实现这一点。 (courses_users)

但是,如果用户希望删除已保存的课程,并且我使用该 ID 发出删除请求,如下所示

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

我最终删除了连接表中的条目和课程表中的条目。我通过查看服务器日志确认了这一点,发现

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

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

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

任何帮助将不胜感激,如果您想让我发布其他任何内容,请询问。

谢谢,

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

一个用户有_and_belongs_to_many门课程

一门课程有_and_belongs_to_many用户

【问题讨论】:

  • 请显示你的模型之间的关系:)
  • 意见:我不喜欢 has_and_belongs_to_many 这种情况。这通常(但不总是)掩盖另一个模型。也许一个用户 has_many Enrollments 和 has_many Courses through Enrollments。 Course has_many Enrollments, and has_many Users through Enrollments, and an Enrollment belongs_to Course, and belongs_to User。显式注册模型允许您存储其他属性(可能是用户评分或学分、注册日期、删除日期等)。
  • @railsdog 这是一个很好的观点。目前我不需要存储这些其他属性,但从长远来看它可能会更有益。我会考虑修改我的人际关系。谢谢!

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


【解决方案1】:

你的代码说要破坏课程,所以这就是 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

【讨论】:

  • 哦,我明白了!我没有意识到差异。感谢您的回答和有用的资源!
【解决方案2】:

下面这行删除了id为params[:id]的课程记录

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

我认为你的意思是:

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

【讨论】:

    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 2014-10-28
    相关资源
    最近更新 更多