Допустим, у меня есть две модели 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 уже имеет значение, последующее изменение больше не меняет ассоциацию статьи. (По крайней мере, не сразу — только после сохранения ему будет присвоено новое значение.)
Это вызывает у меня проблемы в моем методе проверки при обновлении существующих 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) или я что-то не так делаю? Большое спасибо.