Допустим, у меня есть две модели 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) или я что-то делаюнеправильно?Большое спасибо.