Rails: 如何正确修改和保存join中记录的值table

Rails: how to correctly modify and save values of records in join table

我想了解为什么在 Rails 4 (4.2.0) 中,我在连接中处理数据时看到以下行为 table:

student.student_courses

returns 给定用户的所有相关课程记录;

但是下面会保存修改

student.student_courses[0].status = "attending"
student.student_courses[0].save

虽然这不会

student.student_courses.find(1).status = "attending"
student.student_courses.find(1).save

为什么,为什么这两个工作方式不同,第一个是正确的方法吗?

student_courses 是一个 ActiveRecord::Relation,基本上是一个 key => value 商店。 find 方法仅适用于 model

student.student_courses[0]student.student_courses.find(1) 有细微的差别。

当您说 student.student_courses 时,您只是在 ActiveRecord::Relation 中构建查询。一旦您对需要访问数据库的查询执行某些操作,就会检索数据。在你的例子中,那个东西正在调用 []find。当你打电话给 []:

student.student_courses[0]

您的 student 将执行底层查询并将所有 student_courses 存储在某处。您可以通过查看以下内容来了解​​这一点:

> student.student_courses[0].object_id
# and again...
> student.student_courses[0].object_id
# same number is printed twice

但是如果调用find,只会获取一个对象,每次都会获取一个新对象:

> student.student_courses.find(1).object_id
# and again...
> student.student_courses.find(1).object_id
# two different numbers are seen

这意味着:

student.student_courses[0].status = "attending"
student.student_courses[0].save

等同于:

c = student.student_courses[0]
c.status = "attending"
c.save

而这个:

student.student_courses.find(1).status = "attending"
student.student_courses.find(1).save

是这样的:

c1 = student.student_courses.find(1)
c1.status = "attending"
c2 = student.student_courses.find(1)
c2.save

当您使用 find 版本时,您是在完全不同的对象上调用 status=save,因为您 save, save 没有做任何有用的事情。