LineItem と Article という 2 つの ActiveRecord モデルがあるとします。
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)
ますが、これは意図したとおりには見えません。
これは Rails (2.3.11) のバグですか、それとも何か間違っていますか? どうもありがとう。