0

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) のバグですか、それとも何か間違っていますか? どうもありがとう。

4

1 に答える 1

0

これは発生しているバグではなく、AR アソシエーション キャッシュの動作です。true関連付けメソッドに渡すことで、検証中に関連付けを強制的に再ロードできますself.article(true)

を呼び出して、LineItem インスタンスのキャッシュされたすべての関連付けをクリアすることもできます#clear_association_cache

アップデート:

これは実際にはバグでしたが、修正されました。(アレックスのコメントを参照)

于 2011-09-06T18:56:42.017 に答える