Обновление ассоциаций AR через атрибуты _id не обновляет связанный объект (до проверки) - PullRequest
0 голосов
/ 06 сентября 2011

Допустим, у меня есть две модели ActiveRecord: LineItem и Article.

class LineItem < ActiveRecord::Base
  belongs_to :article
  ...
end

Я испытываю следующее поведение на LineItems (Rails 2.3.11):

>> l = LineItem.new
=> #<LineItem id: nil, article_id: nil, ...>
>> l.article_id=10
=> 10
>> l.article
=> #<Article id: 10, ...>
>> l.article_id=20
=> 20
>> l.article
=> #<Article id: 10, ...>

Итакесли article_id уже имеет значение, последующее изменение больше не меняет ассоциацию статьи.(По крайней мере, не сразу - только после сохранения было установлено новое значение.)

Это вызывает у меня проблемы с моим методом validate при обновлении существующих LineItems.В моем LineItems-Controller я обновляю так:

def update
  @line_item = LineItem.find(params[:id])
  @line_item.attributes = params[:data] #params[:data] contains article_id
  ...      
  @line_item.save!
  ...
end

В моем классе LineItem у меня много проверок, подобных этому (упрощенно):

def validate
  if self.article.max_size < self.size
    errors.add_to_base("Too big for chosen article.")
  end
end

При обновлениях эта проверка действует на«старая» статья, так как новая на данный момент только в self.article_id (но не в self.article).Я мог бы заменить self.article на Article.find(self.article_id) в приведенном выше условии, но это не похоже на то, как должно быть.

Это ошибка в рельсах (2.3.11) или я что-то делаюнеправильно?Большое спасибо.

1 Ответ

0 голосов
/ 06 сентября 2011

Это не ошибка, с которой вы сталкиваетесь, а поведение кеша ассоциации AR.Вы можете принудительно перезагрузить ассоциацию во время проверки, передав true методу ассоциации: self.article(true).

Вы также можете удалить все кэшированные ассоциации для экземпляра LineItem, вызвав #clear_association_cache.

ОБНОВЛЕНИЕ:

На самом деле это была ошибка, но она была исправлена!(См. Комментарий Алекса)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...