我正在试用rails指南中给出的self join example。我在表格中添加了'manager_id'字段。
问题是,在关联两个对象之后,直到我调用'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]
为什么会这样?我是否也必须使用相同的方法编写测试用例?不知怎的,我觉得我做错了,应该有更好的方法。
答案 0 :(得分:1)
在你的第一个代码示例中,你的emp实例已被分配了一个管理器,但是你的boss对象没有任何下属,数据库中也没有。
在您调用save on emp之前,ActiveRecord不会知道您将boss作为管理员添加到另一个对象。当您调用save时,记录将保存到数据库中。
将记录保存到测试脚本的数据库没有任何问题,只要您有一个清理脚本,可以在创建它们后删除不需要的记录。这也将测试您的模型的验证和关联。
答案 1 :(得分:1)
当你调用boss.subordinates时,ROR会像这样发出SQL请求:
Select * from subordinates where subordinates.id = #{id}
在你的情况下,下属的数据库中没有记录,你什么也得不到。
您必须将记录保存在数据库中才能使您进行关联工作。