2012-06-12 48 views
1

我正在试用rails guide中给出的self join example。我在表格中添加了一个'manager_id'字段。Rails协会不会自动保存

问题是,在关联这两个对象之后,直到我调用'save'时才会反映出来。

我在开发模式进行了测试通过控制台:

> boss, emp = 2.times.map { FactoryGirl.create :employee } 
> emp.manager = boss 
> emp.manager_id == boss.id 
=> true 
> boss.subordinates 
=> [] 

如果我现在保存“EMP”,我得到了想要的结果。

> emp.save 
> boss.subordinates 
=> [#Employee obj] 

这是为什么?我是否也必须使用相同的方法编写测试用例呢?不知何故,我觉得我做错了,应该有更好的方法。

回答

1

在你的第一个代码示例中,你的emp实例已经被分配了一个管理器,但是你的boss对象没有任何下属,但是数据库中没有任何下属。

直到你调用保存在emp上,ActiveRecord不会知道你将boss作为管理器添加到另一个对象。当您调用保存时,记录将被保存到数据库。

将测试脚本的记录保存到数据库没有任何问题,只要您有一个清理脚本,在您创建脚本后会删除不需要的记录。这也将测试您的模型的验证和关联。

+0

感谢您的明确解释。 –

1

当你调用boss.subordinates,ROR作出这样的SQL请求:

Select * from subordinates where subordinates.id = #{id} 

你的情况存在数据库下属没有记录,你什么也得不到。

您必须在数据库中保存记录,以使您的关联工作。