Я запускаю приложение Rails 2.3.14, которое использует столбец counter_cache, что-то похожее на:
Workshop
belongs_to :group, :counter_cache => true
Group
has_many :workshops
Если я назначаю свою мастерскую группе напрямую, кэш счетчика обновляется нормально.
@workshop.group = Group.first
@workshop.save # group counter updated
Однако, если я назначу group_id для мастерской массовым образом, в традиционном стиле контроллера Rails, кеш НЕ обновляется. Я считаю это ошибкой в 2.3.14.
def update
@workshop = Workshop.find(params[:id])
# params[:workshop] contains a group_id assignment, thus the problem
if @workshop.update_attributes(params[:workshop])
flash[:notice] = 'Workshop was successfully updated.'
# @workshop.group counter NOT updated
Он также существует в более старых версиях:
http://railsforum.com/viewtopic.php?id=34473
Тем не менее, «решение» автора представляет ошибку с двойным счетом - если вы назначите напрямую, вы получите средство обновления рельсов по умолчанию и callback-one, но оно делает работа для update_attributes.
Итак, я могу сделать пару вещей - я могу вырезать group_id из хэша params и назначить его напрямую. Или я могу сделать апдейт-апдейт update_attributes на моей модели Мастерской, чтобы сделать это для меня.
Я бы хотел избежать удаления хэша params, так как он не является интуитивно понятным и самодокументируемым; далее любой, кто может вызвать @ workshop.update_attributes, столкнется с той же ошибкой. Обновление обезьяны update_attributes кажется самым безопасным, но в то же время совершенно ошибочным.
Есть еще предложения?
Спасибо!