2

ゾンビのRSpecテストでは、このテストに合格しようとしています

describe Zombie do
  it "starts off with two weapons" do
    z = Zombie.new(:name => "Ash")
    z.weapons.count.should == 2
  end
end

これを行うために、after_initializeモデルコールバックを使用して武器を作成(「ビルド」)しました

class Zombie < ActiveRecord::Base
  after_initialize :grant_two_weapons

  def grant_two_weapons
     self.weapons.build(:name => "axe")
     self.weapons.build(:name => "stick")
  end
end

現在、テストは合格していませんが、もう1つ問題があります。つまり、タイトルにある問題です。つまり、レールコンソールで…</ p>

z = Zombie.new
z.weapons
#=> [#<Weapon id: nil, name: "axe", zombie_id: nil, created_at: nil, updated_at: nil>, #<Weapon id: nil, name: "stick", zombie_id: nil, created_at: nil, updated_at: nil>] 

テストで説明したように、必要なものが得られているように見えますが、これを行うと、次のようになります。

z.weapons.count
#=> 0

したがって、失敗したテスト。2つのエンティティを持つこの配列のカウントはどのように0になりますか?これは「ビルド」などを取り巻くRailsの質問ですが、Rubyの質問でもあります。その配列には2つのエンティティが含まれていますが、rubyはそれについて「嘘をついている」ようです。

4

2 に答える 2

2

これがcount機能し、データベースでSQLカウントを実行しますが、レコードはまだ保存されていないため、ゼロになります。

z.weapons.sizeまたはz.weapons.lengthあなたが期待するものを与えるでしょう。

たとえば、これをチェックしてください:http: //rhnh.net/2007/09/26/counting-activerecord-associations-count-size-or-length

于 2013-03-02T17:58:10.460 に答える
0

この投稿によると、あなたが行ったように定義されている場合、after_initializeは無視されると述べているいくつかのドキュメントがあります。

ただし、投稿者はそのドキュメントと矛盾する動作を観察したようですので、YMMV。(使用しているRailsのバージョンによって異なる場合がありますが、これは推測です。)

もっと明確な答えを出せたらいいのにと思いますが、これがafter_initializeの動作に精通している人にとっての出発点になることを願っています。

于 2013-03-02T18:06:00.183 に答える