1

我正在尝试rails guide 中给出的自连接示例。我在表中添加了一个“manager_id”字段。

问题是,在关联这两个对象之后,直到我调用“保存”才反映。

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

> 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]

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

4

2 回答 2

1

在您的第一个代码示例中,已为您的 emp 实例分配了一个经理,但您的老板对象没有任何下属,并且数据库中尚不存在任何下属。

在您调用 emp 上的 save 之前,ActiveRecord 不会知道您将 boss 作为经理添加到另一个对象。当您调用 save 时,记录将保存到数据库中。

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

于 2012-06-12T07:25:28.260 回答
1

当你调用 boss.subordinates 时,ROR 会发出如下 SQL 请求:

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

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

您必须将记录保存在数据库中才能使您的关联工作。

于 2012-06-12T08:33:08.610 回答