私は、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 が更新されません。私はたくさんのものを試しましたが、それを正しく機能させる方法を理解できないようです. どんな助けでも大歓迎です。ありがとう。