0

私は、counter_cache を使用したい場所で作成中の Padrino アプリを持っています。ORM として ActiveRecord を使用しています。私のリポジトリ モデルでは、特定のリポジトリに関連付けられているコントリビューションの数を数えたいと考えています。関連するモデルは次のとおりです。

class Repository < ActiveRecord::Base

  has_many :contributions, autosave: true
  has_many :users, through: :contributions

  validates :full_name, presence: true, uniqueness: true

end

class Contribution < ActiveRecord::Base

  belongs_to :user
  belongs_to :repository, counter_cache: true

end 

class User < ActiveRecord::Base

  has_many :contributions
  has_many :repositories, through: :contributions

  validates :username, presence: true, uniqueness: true

end

スキーマは次のとおりです。

  create_table "contributions", :force => true do |t|
    t.integer  "user_id"
    t.integer  "repository_id"
  end

  create_table "repositories", :force => true do |t|
    t.string   "full_name"
    t.integer  "contributions_count", :default => 0
  end

  create_table "users", :force => true do |t|
    t.string   "username"
  end

私は、contributions_count が適切に更新されていることを確認するために、Rspec でテストを作成しました。しかし、私はそれを渡すことができません。仕様は次のとおりです。

  describe "when a new contribution is created" do
    it "updates the counter cache" do
      repo = Repository.create(full_name: "sample_repo")
      user = User.create(username: "sample_user")
      expect {
        Contribution.create(user: user, repository: repo)
        }.to change {repo.contributions_count }.by(1)
      end
    end

仕様を実行すると、次のエラーが発生します。

  1) Repository when a new contribution is created updates the counter cache
     Failure/Error: expect {
       result should have been changed by 1, but was changed by 0
     # ./spec/models/repository_spec.rb:43:in `block (3 levels) in <top (required)>'

コンソールでコントリビューションの作成も試みましたが、リポジトリの counter_cache が更新されません。私はたくさんのものを試しましたが、それを正しく機能させる方法を理解できないようです. どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

1

これは、オブジェクトがデータベースに保存されているrepoときに、オブジェクトが Ruby によって魔法のように更新されていないためだと思います。Contributionデータベースから情報をリロードする必要があります。

repo.reload.contributions_count
于 2013-08-15T03:58:08.010 に答える