Project
has_many という 1 つのモデルを持つ外部フレームワーク (redmine) を使用していますEnabledModules
。
プロジェクトは、次のように、モジュール名を介して EnabledModules を「添付」または「削除」することができます。
class Project < ActiveRecord::Base
...
has_many :enabled_modules, :dependent => :delete_all
...
def enabled_module_names=(module_names)
enabled_modules.clear
module_names = [] unless module_names && module_names.is_a?(Array)
module_names.each do |name|
enabled_modules << EnabledModule.new(:name => name.to_s)
end
end
end
のコールバックを介して新しいモジュールがいつ接続/削除されたかを検出しEnabledModule
、可能であれば「元のソースコード」を変更したくありません。
次のような「添付ファイル」を検出できます。
class EnabledModule < ActiveRecord::Base
belongs_to :project
after_create :module_created
def module_created
logger.log("Module attached to project #{self.project_id}")
end
end
before_destroy
削除の検出にはa が機能すると思っていましたが、そうではありません。これは、 の呼び出しがモジュールで「destroy」をenabled_modules.clear
呼び出さないために発生します。Project.enabled_module_names=
それらproject_id
をnilに設定するだけです。だから私はafter_update
orを使うべきだと考えましたbefore_update
。
を使用する場合after_update
、「前の」を取得するにはどうすればよいproject_id
ですか?
を使用する場合before_update
、「更新されたばかり」のモジュールと project_id が nil にリセットされるモジュールをどのように区別できますか?
ここでまったく別のアプローチを使用する必要がありますか?
編集: 「_was」(つまり)で古い値を取得できることがわかりましたself.project_was
。ただし、collection.clear
更新コールバックをトリガーしていないようです。他の解決策はありますか?
編集2:タイトルを変更