Учитывая, что у меня есть следующие модели:
class Location < Active::Record
has_many :storables, foreign_key: :bin_id
# ...
end
class Storable < Active::Record
belongs_to :bin, class_name: :Location, counter_cache: true
# ...
end
Когда я запускаю следующую спецификацию, counter_cache
увеличивается неправильно. Методы #1
и #2
работают должным образом, но НЕ #3
. Что дает?
describe "location storables" do
specify "adding a storable increments the counter cache" do
l = Location.create
l.storables_count.should == 0 #=> PASSES
# method 1
s = Storable.create(bin: l)
l.reload
l.storables_count.should == 1 #=> PASSES
# method 2
l.storables.create
l.reload
l.storables_count.should == 2 #=> PASSES
# method 3
l.storables << Storable.create
l.reload
l.storables_count.should == 3 #=> FAILS, got 2 not 3
end
end
Меня очень смущает наполовину работающий counter_cache. Я также не могу обнаружить проблему с конфигурацией.
Использование Rails 3.2.12 в этом проекте.
ОБНОВЛЕНИЕ
Обновление до rails 4 не помогло. Кроме того, если я изменю метод № 3 на следующий, тест пройдет:
# method 3
l.storables << Storable.create
puts "proxy : #{l.storables.count}" #=> 3
puts "relation : #{Storable.count}" #=> 3
puts "cache : #{l.storables_count}" #=> 2
Location.reset_counters(l.id, :storables) # corrects cache
l.reload
l.storables_count.should == 3 #=> PASSES
Почему это не происходит автоматически?
l.storables << Storable.last
, что, вероятно, хуже. - person dgilperez   schedule 18.07.2013