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
没有做任何有用的事情。
我想了解为什么在 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
没有做任何有用的事情。