1

私のモデルでは

class User < ActiveRecord::Base
    has_one :user_detail, dependent: :destroy
end

class UserDetail < ActiveRecord::Base
  belongs_to :user
end

User オブジェクトに対して destroy を呼び出すと、関連する UserDetail オブジェクトが破棄されません。

user_detailこれがテストです (もちろん、 is が nil ではないので失敗します):

  test "associate object should be destroyed" do
    user_id = @user.id
    @user.destroy
    user_detail = UserDetail.find_by(:user_id => user_id)
    assert_nil user_detail
  end

なぜこれが起こるのか誰にも分かりますか?

4

1 に答える 1

0

ロジックは問題ありませんが、問題はテスト コードです。これを試して:

test "associate object should be destroyed" do
  user_detail = @user.user_detail
  @user.destroy
  expect(UserDetail.find_by(:user_id => @user.id)).to be_nil
end

何が起こっているかというと、対応するデータベース行user_detailが破棄されていますが、変数はまだ値を保持しています。

コードブロックをコメントに入れることができないため、編集してコメントに応答します。

@user.id は nil ではありません。これをテストすると、メモリ内モデルであるため、ID がまだ保持されていることがわかります。テスト中のランダムなレールアプリがあります。コンソール出力は次のとおりです。

irb(main):002:0> l = Loan.first
irb(main):003:0> l.destroy
irb(main):004:0> l.id
=> 14
于 2015-05-26T04:32:10.567 に答える