1

Railsガイドに記載されている自己結合の例を試していました。テーブルに「manager_id」フィールドを追加しました。

問題は、2 つのオブジェクトを関連付けた後、「保存」を呼び出すまで反映されないことです。

開発モードでコンソールからテストしました:

> 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 は、上司をマネージャーとして別のオブジェクトに追加したことを認識しません。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 に答える