Ассоциация Rails counter_cache'd обновляется с помощью update_attributes; Столбец counter_cache не обновляется - PullRequest
1 голос
/ 29 декабря 2011

Я запускаю приложение 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 кажется самым безопасным, но в то же время совершенно ошибочным.

Есть еще предложения?

Спасибо!

1 Ответ

1 голос
/ 30 января 2012

Будет ли использовать Group.update_counters (params [: workshop] [: group_id],: workshop_count => +1) или что-то подобное?

Найден хороший ресурс, который исправил мою проблему, похожую на вашучерез Джош Оуэнс .Также, Rails api также имеет некоторую информацию.В моем случае, используя ваши имена, я хочу переместить мастерскую из одной группы в другую и соответствующим образом обновить счетчики.

...