4

私はたくさんの has_many :through リレーションをアプリに持っています。接続されたオブジェクトの数など、これに関連する情報を広範囲に表示しています。ユーザーがリレーションを更新するたびに、結合テーブルが変更され、これをスイーパーでキャッチできます。

問題は、結合テーブルのエントリが削除され、破棄されないことです。関係がなくなった場合、これを検出する正当な方法がなく、キャッシュから誤解を招く情報を表示しています。:touch => true や :counter_cache => true のようなものはすべて部分的に機能します。リレーションが更新または作成されると増加します。しかし、ユーザーがリレーションを削除しても何も起こりません。:counter_cache が壊れていて、:touch がトリガーされません。

ガベージ ソリューションは、メイン モデルが保存されるときに、コントローラーで .touch を呼び出すことです。この種の作品は、しかし、それは本当に非専門家のようです. これは、コントローラーではなく、モデル ロジックにある必要があります。

私は何か大きなものを見逃しているように感じますが、これについて頭を悩ませることはできません. 誰でもこの問題について洞察を得ることができますか?

4

2 に答える 2

1

Monkey patching Active Record isn't necessary. When defining your association, set the :dependent option to :destroy.

class Book < ActiveRecord::Base
  has_many :authorships, :dependent => :destroy
  has_many :authors, :through => :authorships, :dependent => :destroy
end
于 2013-02-19T19:10:27.180 に答える
0

Mark S. が自身の質問に答えるために書いたモンキー パッチを確認してください: How to create a full Audit log in Rails for every table?

ActiveRecord::Associations::HasManyThroughAssociation.class_eval do 
  def delete_records(records)
    klass = @reflection.through_reflection.klass
    records.each do |associate|
      klass.destroy_all(construct_join_attributes(associate))
    end
  end
end

あなたの問題にも役立つかもしれません。これは Rails 2 のものであることに注意してください。すでに Rails 3 を使用している場合は、状況が異なる場合があります。

于 2010-12-07T01:57:49.767 に答える