我想理解为什么在Rails 4(4.2.0)中我在连接表中操作数据时会看到以下行为:
student.student_courses
返回给定用户的所有相关课程记录;
但以下内容将保存更改
student.student_courses[0].status = "attending"
student.student_courses[0].save
虽然不会
student.student_courses.find(1).status = "attending"
student.student_courses.find(1).save
为什么这样,为什么这两个人的工作方式不同,第一个是正确的方法吗?
答案 0 :(得分:2)
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
没有做任何有用的事情。
答案 1 :(得分:-1)
student_courses
是ActiveRecord::Relation
,基本上是key => value
商店。 find
方法仅适用于model