Rails:如何正确修改和保存连接表中的记录值

时间:2015-01-13 22:09:26

标签: ruby-on-rails ruby many-to-many associations rails-activerecord

我想理解为什么在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

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

2 个答案:

答案 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_coursesActiveRecord::Relation,基本上是key => value商店。 find方法仅适用于model